设计模式的选择通常取决于特定的设计问题和上下文环境。以下是对一些设计模式的对比和它们在不同应用场景下的使用示例:
设计模式对比及应用场景
单例模式:
应用场景:配置管理器、线程池、数据库连接池等。
特点:确保全局只有一个实例,提供统一访问点。
策略模式:
应用场景:算法动态切换,如排序算法、优惠促销策略等。
特点:定义一系列可互换的算法,可动态更改对象的行为。
代理模式:
应用场景:访问控制、延迟初始化、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("设置缓存");
}
}
每种设计模式都有其特定的使用场景和特点,合理选择和应用设计模式可以提高代码的可读性、可维护性和灵活性。