以上设计模式都是自己在开发过程中使用过的模式,处于一个慢慢积累的过程中。
将某个类运行过程中,把核心算法提出来、封装,使得对象在针对不同的情境下可以方便的更换执行策略,使得算法更加独立。
例如排序算法:
public abstract class SortStrategy{
public abstract void sort();
}
class QuickSortStrategy extend SortStrategy{
public void sort(){
}
}
class selectSortStrategy extend SortStrategy{
public void sort(){
}
}
定义一个算法流程骨架,把一些可变节点延迟到具体的子类去执行。
例如有个炒菜过程: 1、倒油 2、加菜 3、调味料 4、翻炒
以上四个步骤中,1跟4是一致的,2跟3针对不同类型的菜会有差异。
public abstract class class{
final void pourOil();
void addVegetables();
void addFlavor();
final void stirFry();
}
- 模版办法按照一定的执行顺序,任何一个节点被重载不会影响这个次序;策略方法只是提供了某个场景下的执行策略,为了优化某个场景而制定。
- 模版方法可变节点大于等于一,策略模式被重载的节点一般唯一。
- 模版方法是流程中的某几个节点被替换,但顺序不变,策略模式整个算法都可以被替换。
避免请求发送者跟接受者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
- Handler(抽象处理者):它定义了一个处理请求的接口,一般设计为抽象类,由于不同的具体处理者处理请求的方式不同,因此在其中定义了抽象请求处理方法。
- ConcreteHandler(具体处理者):它是抽象处理者的子类,可以处理用户请求,在具体处理者类中实现了抽象处理者中定义的抽象请求处理方法,在处理请求之前需要进行判断,看是否有相应的处理权限,如果可以处理请求就处理它,否则将请求转发给后继者。
假如存在一个请求流程为
员工发起请假申请 -> 主管审批 -> 经理审批 -> 老板审批
@Date
public class LeaveRequest{
private String name;
private Integer dayCount;
}
@Date
public class Handler{
private String name;
private String Hanlder nextHandler;
public Handler(name){
this.name = name;
}
public Hanlder setNextHandler(Handler nextHandler){
this.nextHandler = nextHandler;
return nextHandler;
}
public abstract boolean handle(LeaveRequest leaveRequest);
}
/**
* 主管
*/
@Date
public class Leader extend Handler{
public Leader(String name){
suprt(name);
}
public boolean hanlde(LeaveRequest leaveRequest){
// done
}
}
/**
* 经理
*/
@Date
public class Manager extend Handler{
public Manager(String name){
suprt(name);
}
public boolean hanlde(LeaveRequest leaveRequest){
// done
}
}
/**
* 老板
*/
@Date
public class Boss extend Handler{
public Boss(String name){
suprt(name);
}
public boolean hanlde(LeaveRequest leaveRequest){
// done
}
}
/**
* 提供一个请求接口出去
*/
@Date
public class LeaveApprove{
private Handler handler;
public LeaveApprove(){
Handler leader = new Leader("zhangsan");
Handler manager = new Manager("lisi");
Handler boss = new Boss("wangwu");
leader.setNextHandler(manager).setNextHandler(boss);
this.handler = leader;
}
public boolean approveLeave(LeaveRequest leaveRequest){
while(handler != null){
boolean result = hanlder.handle(leaveRequest);
if(result){
handler = handler.next;
}else{
return false;
}
}
return true;
}
}