首页 > 其他分享 >职责链模式

职责链模式

时间:2022-11-30 12:13:10浏览次数:46  
标签:name 处理 Approver request 模式 processRequest public 职责

职责链模式:

OA系统采购审批需求

传统解决方案:

 

 

 

传统方案解决OA审批系统问题分析:

 

 

 

职责链模式基本介绍

 

 

 

职责链模式原理类图

 

 

 

 

 

 

职责链模式解决OA采购审批

 

 

 

 

代码实现

package com.sky.responsebility;

// 处理者
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 request);
}

 

package com.sky.responsebility;

public class DepartmentApprover extends Approver{


    //构造器
    public DepartmentApprover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest request) {
        if (request.getPrice() <= 5000){
            System.out.println(" 请求编号 id = " + request.getId() + "  " + this.name + " 处理");
        }else { // 如果他处理不了,就让他的后继者进行处理
            approver.processRequest(request);
        }
    }
}

 

package com.sky.responsebility;

public class CollageApprover extends Approver {

    //构造器
    public CollageApprover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest request) {

        if (request.getPrice() > 5000 && request.getPrice() <= 10000) {
            System.out.println(" 请求编号 id = " + request.getId() + "  " + this.name + " 处理");
        }else { // 如果他处理不了,就让他的后继者进行处理
            approver.processRequest(request);
        }
    }
}

 

package com.sky.responsebility;

/**
 * 副校长
 */
public class ViceSchoolMasterApprover extends Approver {

    //构造器
    public ViceSchoolMasterApprover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest request) {

        if (request.getPrice() > 10000 && request.getPrice() <= 30000) {
            System.out.println(" 请求编号 id = " + request.getId() + "  " + this.name + " 处理");
        }else { // 如果他处理不了,就让他的后继者进行处理
            approver.processRequest(request);
        }
    }
}

 

package com.sky.responsebility;

public class SchoolMasterApprover extends Approver {

    //构造器
    public SchoolMasterApprover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest request) {

        if (request.getPrice() > 30000) {
            System.out.println(" 请求编号 id = " + request.getId() + "  " + this.name + " 处理");
        }else { // 如果他处理不了,就让他的后继者进行处理
            approver.processRequest(request);
        }
    }
}

 

package com.sky.responsebility;

/**
 *   请求类
 */
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;
    }

    // 添加对应的get方法
    public int getType() {
        return type;
    }

    public float getPrice() {
        return price;
    }

    public int getId() {
        return id;
    }
}

 

package com.sky.responsebility;

/**
 * 客户端
 */
public class Client {

    public static void main(String[] args) {

        // 创建一个请求

// 可以改变金额进行测试
        PurchaseRequest purchaseRequest = new PurchaseRequest(1, 30001, 1);

        //创建相关的审批人、
        Approver departmentApprover = new DepartmentApprover("张主任");
        Approver collageApprover = new CollageApprover("李院长");
        Approver viceSchoolMasterApprover = new ViceSchoolMasterApprover("王副校长");
        Approver schoolMasterApprover = new SchoolMasterApprover("童校长");

        //需要将各个审批级别的下一个处理者设置好(处理人构成环形:【否则会报NullPointerException】)
        departmentApprover.setApprover(collageApprover);
        collageApprover.setApprover(viceSchoolMasterApprover);
        viceSchoolMasterApprover.setApprover(schoolMasterApprover);
        schoolMasterApprover.setApprover(departmentApprover);

        //进行请求的处理
        departmentApprover.processRequest(purchaseRequest);

    }
}

 

运行结果:

请求编号 id = 1 被 童校长 处理

 

(职责链模式有在SpringMVC框架中使用)

 

职责链模式的注意事项

 

标签:name,处理,Approver,request,模式,processRequest,public,职责
From: https://www.cnblogs.com/dongyaotou/p/16938027.html

相关文章

  • 设计模式七个原则
    程序设计七大原则:1.单一职责原则设计的一个类应该专门的负责对应一件事情2.开放封闭原则一、开放封闭原则是面向对象所有原则的核心二、1.对功能扩展开放2.面向修改......
  • 9月30日晚上“Eduardo B. Fernandez--安全领域的分析模式”讲座录像
    9月30日晚上“EduardoB.Fernandez--安全领域的分析模式”讲座录像更高清版本请在百度网盘下载:http://pan.baidu.com/s/1jGzYOrsEduardoB.Fernandez。美国佛罗里达大西洋......
  • 设计模式之迭代器模式
    概述在软件开发时,经常需要使用聚合对象来存储一系列数据。聚合对象拥有两个职责:一是存储数据;二是遍历数据。从依赖性来看,前者是聚合对象的基本职责;而后者既是可变化的,又是......
  • 命令查询职责分离 - CQRS
    概念CQRS是一种与领域驱动设计和事件溯源相关的架构模式,它的全称是CommandQueryResponsibilitySegregation,又叫命令查询职责分离,GregYoung在2010年创造了这个术......
  • 迭代器模式
    1. 迭代器模式简介     把对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍历访问的设计模式。   如果不使用Iterator模式,会......
  • 适配器模式
    1. 适配器模式简介   将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。2. 案例    需要使......
  • 企业办公新模式,随时随地云上协同!
    如今,越来越多人参与到项目中进行协同,因此对企业内部的协同办公提出了更高的要求,同时加之大环境下的居家办公要求,导致很多人一回到家之后就会出现无电脑可用、没有办公室电脑......
  • 单例模式
    1.单例模式简介  (1)多线程模式下,共享同一个资源或者操作同一个资源,单例模式保证一个类只生成唯一的一个对象      例如:多个线程使用同一个socket资源;配置......
  • 策略模式
    风带着万物全部飘散,可那飘散的不是万物,而是我的青春一个简单的鸭子应用使用简单继承的模式实现多个不同的鸭子实现类。新需求-鸭子能飞现在公司为了甩开其他竞争......
  • 设计模式之解释器模式
    文法规则和抽象语法树解释器模式描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。在正式分析解释器模式结构之前,先来学习如何表示一......