- 策略模式(Strategy Pattern)
定义:又叫做政策模式,他将定义的算法族封装起来,让他们可以互相替换,让算法的扩展独立于使用它的用户
应用场景:比如你有一个产品类实现了一个功能,这个功能比较复杂,需要依靠一个可以抽象出来的算法(方法),这个算法经常需要扩展,那么就可以用策略模式,产品类依赖于抽象的算法类,而产品的功能调用具体注入的算法(策略)的抽象(抽象策略)
角色:上下文角色,抽象策略角色,具体策略角色
策略模式在框架中的应用:
JDK中的比较器Comparator接口,compare()方法就是策略抽象的实现
Spring源码中Resource接口,我们经常用它的子类来完成一下功能
Spring源码中对于对象的初始化,也采用了策略模式,不同类采用不同的初始化策略,首先是一个InstantiationStrategy接口,下面有两个策略类SimpleInstantiationStrategy和CglibSubclassingInstantiationStrategy
优点:符合开闭原则,避免使用多重条件判断语句
缺点:客户端必须知道所有的策略,代码中策略类会非常多
- 责任链模式(Chain of Responsibility Pattern)
定义:将链中每一个节点都看作一个对象,每个节点处理的请求均不同,当一个请求从链式的首端发出时,会沿着责任链预设的路径一次传递到每个节点对象,直到被链中的某个对象处理为止
常用于业务流程的环节设计中,专业的事情交给专业的人去做,主要解耦了请求和处理
应用场景:多个对象可以处理同一个请求,但具体由哪个对象处理则在运行时动态决定
可动态指定一组对象处理请求
角色:抽象处理者,具体处理者
通用写法:
package com.ChainPattern;
/**
* @author yangxiaozhen
* @date 2022/5/19-22:00
*/
public abstract class Handler {
protected Handler nextHandler;
public void setNextHandler(Handler handler) {
this.nextHandler = handler;
}
public abstract void handleRequest(String request);
public static void main(String[] args) {
Handler handler = new ConceteHandlerB();
handler.setNextHandler(new ConcreteHandlerA());
handler.handleRequest("requestA");
}
}
package com.ChainPattern;
/**
* @author yangxiaozhen
* @date 2022/5/19-22:02
*/
public class ConcreteHandlerA extends Handler {
@Override
public void handleRequest(String request) {
if ("requestA".equals(request)){
System.out.println(this.getClass().getSimpleName()+"deal with request:"+request);
return;
}else {
System.out.println("不关a的事");
}
if (this.nextHandler!=null){
this.nextHandler.handleRequest(request);
}
}
}
package com.ChainPattern;
/**
* @author yangxiaozhen
* @date 2022/5/19-22:05
*/
public class ConceteHandlerB extends Handler {
@Override
public void handleRequest(String request) {
if ("requestB".equals(request)){
System.out.println(this.getClass().getSimpleName()+"deal with request:"+request);
return;
}else {
System.out.println("不关b的事");
}
if (this.nextHandler!=null){
this.nextHandler.handleRequest(request);
}
}
}
使用责任链模式和建造者模式设计热插拔权限管理:
package com.ChainPattern;
/**
* @author yangxiaozhen
* @date 2022/5/19-22:47
*/
public abstract class NewHandler {
protected NewHandler chain;
public void next(NewHandler newHandler) {
this.chain = newHandler;
}
public abstract void doHandle(Member member);
public static class Builder<T> {
//保存链表的头build时return出去
private NewHandler head;
private NewHandler tail;
public Builder addHandler(NewHandler handler) {
if (this.head == null) {
this.head = this.tail = handler;
return this;
}
this.tail.next(handler);
this.tail = handler;
return this;
}
public NewHandler build() {
return this.head;
}
}
}
在Spring源码中的应用:
FilterChain接口下的实现类,通过维护一个list装配了所有需要的filter,然后调用doFilter的时候遍历调用filter list
优点:链路结构灵活,可以通过改变链路结构动态的改变责任,易于扩展符合开闭原则
缺点:责任链太长可能会影响性能