设计模式对比及应用场景

设计模式的选择通常取决于特定的设计问题和上下文环境。以下是对一些设计模式的对比和它们在不同应用场景下的使用示例:

设计模式对比及应用场景

单例模式:

应用场景:配置管理器、线程池、数据库连接池等。

特点:确保全局只有一个实例,提供统一访问点。

策略模式:

应用场景:算法动态切换,如排序算法、优惠促销策略等。

特点:定义一系列可互换的算法,可动态更改对象的行为。

代理模式:

应用场景:访问控制、延迟初始化、AOP底层实现等。

特点:为其他对象提供一种代理,以控制对它的访问。

观察者模式:

应用场景:事件监听、用户界面更新、Zookeeper监听器等。

特点:定义对象间的一对多依赖关系,当对象状态改变时,所有依赖它的对象都会得到通知。

责任链模式:

应用场景:审批流程、网关鉴权等。

特点:使多个对象都有机会处理请求,避免请求发送者与接收者之间的耦合。

装饰器模式:

应用场景:动态添加功能,如缓存装饰器、日志装饰器等。

特点:动态地给一个对象添加额外的职责。

模板方法模式:

应用场景:需要固定算法骨架,同时允许子类定制某些步骤,如JdbcTemplate。

特点:在方法中定义算法骨架,延迟一些步骤的实现。

线程池的单例模式实现

单例模式确保全局只有一个线程池实例,适用于资源池管理。

电商优惠促销策略模式实现

策略模式允许根据不同的促销活动动态切换优惠策略。

// 优惠策略接口

interface PromotionStrategy {

double applyDiscount(double originalPrice);

}

// 具体优惠策略

class PercentagePromotion implements PromotionStrategy {

@Override

public double applyDiscount(double originalPrice) {

return originalPrice * 0.8; // 打8折

}

}

// 促销上下文

class PromotionContext {

private PromotionStrategy strategy;

复制代码
public void setPromotionStrategy(PromotionStrategy strategy) {
    this.strategy = strategy;
}

public double getDiscountedPrice(double originalPrice) {
    return strategy.applyDiscount(originalPrice);
}

}

AOP底层代理模式实现

代理模式在AOP中用于创建代理对象,实现方法的前置或后置处理。

// 目标对象

class TargetObject {

public void performTask() {

System.out.println("执行任务");

}

}

// 代理对象

class ProxyObject implements ITarget {

private TargetObject target;

复制代码
public ProxyObject(TargetObject target) {
    this.target = target;
}

@Override
public void performTask() {
    // 前置处理
    System.out.println("前置处理");
    target.performTask();
    // 后置处理
    System.out.println("后置处理");
}

}

RedisTemplate、JdbcTemplate模板模式实现

模板模式在JdbcTemplate和RedisTemplate中用于定义操作数据库或Redis的固定步骤。

// 模板类

class JdbcTemplate {

public void execute(String sql) {

System.out.println("执行SQL: " + sql);

// 其他数据库操作

}

}

Zookeeper监听器观察者模式实现

观察者模式在Zookeeper中用于监听节点变化,实现分布式协调。

// 观察者接口

interface Watcher {

void process(WatchedEvent event);

}

// Zookeeper客户端

class ZookeeperClient {

public void registerWatcher(Watcher watcher) {

// 注册监听器

}

}

微服务网关鉴权责任链模式实现

责任链模式在微服务网关中用于实现多级鉴权。

// 鉴权处理器接口

interface Authenticator {

boolean authenticate(Request request, Authenticator next);

}

// 具体鉴权处理器

class PasswordAuthenticator implements Authenticator {

@Override

public boolean authenticate(Request request, Authenticator next) {

// 密码鉴权逻辑

if (/* 鉴权成功 */) {

return true;

} else if (next != null) {

return next.authenticate(request, null);

}

return false;

}

}

多级缓存架构装饰器模式实现

装饰器模式在多级缓存架构中用于动态添加缓存层。

// 缓存接口

interface Cache {

Object get(Object key);

void set(Object key, Object value);

}

// 具体缓存实现

class SimpleCache implements Cache {

@Override

public Object get(Object key) {

return null; // 获取缓存

}

复制代码
@Override
public void set(Object key, Object value) {
    // 设置缓存
}

}

// 缓存装饰器

class LoggingCacheDecorator implements Cache {

private Cache cache;

复制代码
public LoggingCacheDecorator(Cache cache) {
    this.cache = cache;
}

@Override
public Object get(Object key) {
    System.out.println("访问缓存");
    return cache.get(key);
}

@Override
public void set(Object key, Object value) {
    cache.set(key, value);
    System.out.println("设置缓存");
}

}

每种设计模式都有其特定的使用场景和特点,合理选择和应用设计模式可以提高代码的可读性、可维护性和灵活性。

相关推荐
Carl_奕然3 小时前
【智能体】Agent的四种设计模式之:ReAct
人工智能·设计模式·语言模型
二哈赛车手5 小时前
新人笔记---多策略搭建策略执行链实现RAG检索后过滤
java·笔记·spring·设计模式·ai·策略模式
楼田莉子5 小时前
仿Muduo的高并发服务器:Channel模块与Poller模块
linux·服务器·c++·学习·设计模式
geovindu21 小时前
go: Strategy Pattern
开发语言·设计模式·golang·策略模式
嵌入式学习_force1 天前
02_state
设计模式·蓝牙
qcx231 天前
Warp源码深度解析(七):Token预算策略——双轨计费、上下文溢出与摘要压缩
人工智能·设计模式·rust·wrap
Cosolar2 天前
提示词工程面试题系列 - Zero-Shot Prompting 和 Few-Shot Prompting 的核心区别是什么?
人工智能·设计模式·架构
geovindu2 天前
go:Template Method Pattern
开发语言·后端·设计模式·golang·模板方法模式
钝挫力PROGRAMER2 天前
贫血模型的改进
java·开发语言·设计模式·架构
qcx232 天前
Warp源码深度解析(二):自研GPU UI框架——WarpUI的ECH模式与渲染管线
人工智能·ui·设计模式·rust