Skip to content

Latest commit

 

History

History
154 lines (124 loc) · 4 KB

设计模式.md

File metadata and controls

154 lines (124 loc) · 4 KB

设计模式

以上设计模式都是自己在开发过程中使用过的模式,处于一个慢慢积累的过程中。

策略模式

将某个类运行过程中,把核心算法提出来、封装,使得对象在针对不同的情境下可以方便的更换执行策略,使得算法更加独立。

例如排序算法:

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;
    }
}