其他分享
首页 > 其他分享> > 设计模式の责任链模式

设计模式の责任链模式

作者:互联网

目录

前言:

定义与特点:

结构与实现:

举例:


前言:

在现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如,某种商品的物价上涨时会导致部分商家高兴,而消费者伤心;还有,当我们开车到交叉路口时,遇到红灯会停,遇到绿灯会行。这样的例子还有很多,例如,股票价格与股民、微信公众号与微信用户、气象局的天气预报与听众、小偷与警察等。

在软件世界也是这样,例如,Excel 中的数据与折线图、饼状图、柱状图之间的关系;MVC 模式中的模型与视图的关系;事件模型中的事件源与事件处理者。所有这些,如果用观察者模式来实现就非常方便。

定义与特点:

观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。

它的主要缺点如下。

  1. 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。符合依赖倒置原则。

  2. 目标与观察者之间建立了一套触发机制。

结构与实现:

职责链模式主要包含以下角色。

  1. 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。

  2. 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。

  3. 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

举例:

需求:

类图:  

代码实现:

//请求类
public class PurchaseRequest {
    private int type = 0;//请求类型
    private float price = 0.0f;//请求金额
    private int id = 0;//请求编号

    //构造器
    public PurchaseRequest(int type, float price, int id) {
        this.type = type;
        this.price = price;
        this.id = id;
    }

    public int getType() {
        return type;
    }

    public float getPrice() {
        return price;
    }

    public int getId() {
        return id;
    }
}

//抽象处理者
public abstract class Approver {
    //下一个处理者
    Approver approver;
    //名字
    String name;

    public Approver(String name) {
        this.name = name;
    }

    //设置下一个处理者
    public void setApprover(Approver approver) {
        this.approver = approver;
    }

    //处理请求审批的方法,子类也就是具体的处理者来完成出理,这里抽象
    public abstract void processRequest(PurchaseRequest p);
}

//具体处理者1
public class DepartmentApprover extends Approver {

    public DepartmentApprover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest p) {
        if (p.getPrice() < 3000) {
            System.out.println("请求编号为:"+ p.getId() + "\t被"+ this.name + "处理");
        }else {
            approver.processRequest(p);
        }
    }
}

//具体处理者2
public class CollegeApprover extends Approver {

    public CollegeApprover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest p) {
        if (p.getPrice() > 5000 && p.getPrice() <= 10000) {
            System.out.println("请求编号为:" + p.getId() + "\t被" + this.name + "处理");
        } else {
            approver.processRequest(p);
        }
    }
}

//具体处理者3
public class ViceSchoolMasterApprover extends Approver{
    public ViceSchoolMasterApprover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest p) {
        if (p.getPrice() > 10000 && p.getPrice() <= 30000) {
            System.out.println("请求编号为:" + p.getId() + "\t被" + this.name + "处理");
        } else {
            approver.processRequest(p);
        }
    }
}

//具体处理者4
public class SchoolMasterApprover extends Approver{
    public SchoolMasterApprover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest p) {
        if (p.getPrice() > 30000) {
            System.out.println("请求编号为:"+ p.getId() + "\t被"+ this.name + "处理");
        }else {
            approver.processRequest(p);
        }
    }
}

//客户类
public class Client {
    public static void main(String[] args) {
        //创建一个请求
        PurchaseRequest pr = new PurchaseRequest(1,31000,1);
        //创建相关处理人
        DepartmentApprover departmentApprover = new DepartmentApprover("张主任");
        CollegeApprover collegeApprover = new CollegeApprover("李院长");
        ViceSchoolMasterApprover viceSchoolMasterApprover = new ViceSchoolMasterApprover("王副校长");
        SchoolMasterApprover schoolMasterApprover = new SchoolMasterApprover("佟校长");
        //设置下一个处理人
        departmentApprover.setApprover(collegeApprover);
        collegeApprover.setApprover(viceSchoolMasterApprover);
        viceSchoolMasterApprover.setApprover(schoolMasterApprover);
        schoolMasterApprover.setApprover(departmentApprover);

        //处理请求
        departmentApprover.processRequest(pr);

    }
}

运行结果: 

请求编号为:1    被佟校长处理

标签:name,处理,Approver,模式,责任,PurchaseRequest,设计模式,public,请求
来源: https://blog.csdn.net/tiankuihan/article/details/122351367