很多对象有每个对象对其下家的引用而连接起来形成一条链,请求在这条链上传递,直到链上某个对象决定处理此请求,应用场景如单位审批流程等。

  要点:1)抽象处理者角色:定义处理请求接口及设定下家引用

        2)具体处理着角色:具体处理请求或选择将请求传给下家

1、抽象处理者角色类,定义处理请求接口及下家引用

public abstract class PriceHandle {

    protected PriceHandle successor;

    public void setSuccessor(PriceHandle successor) {
this.successor = successor;
} public abstract void process(float discount); public static PriceHandle createPriceHandle() {
PriceHandle sales = new Sales();
PriceHandle direct = new Direct();
PriceHandle ceo = new CEO(); sales.setSuccessor(direct);
direct.setSuccessor(ceo);
return sales;
}
}

2、具体处理者角色类销售类

public class Sales extends PriceHandle {
public void process(float discount) {
if(discount <= 0.1) {
System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(), discount);
} else {
successor.process(discount);
}
}
}

3、具体处理者角色主管类

public class Direct extends PriceHandle {

    public void process(float discount) {
if(discount <= 0.2) {
System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(), discount);
} else {
successor.process(discount);
}
}
}

4、具体处理者角色ceo类

public class CEO extends PriceHandle {
public void process(float discount) {
if(discount <= 0.3) {
System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(), discount);
} else {
System.out.format("%s拒绝了折扣:%.2f%n",this.getClass().getName(), discount);
}
}
}

5、测试类

public class Model {

    private PriceHandle priceHandle;

    public void setPriceHandle(PriceHandle priceHandle) {
this.priceHandle = priceHandle;
} public void requestDiscount(float discount) {
priceHandle.process(discount);
} public static void main(String[] args) {
Model customer = new Model();
customer.setPriceHandle(PriceHandle.createPriceHandle());
Random random = new Random();
for(int i = 0; i < 100; i++) {
System.out.print(i + ":");
customer.requestDiscount(random.nextFloat());
}
} }

最新文章

  1. javascript 提取表单元素生成用于提交的对象(序列化 html 表单)
  2. 【转】Thread.isBackground
  3. javascript事件执行流程分析
  4. 在python包管理中使用easy_install软件的步骤
  5. ThinkPHP讲解(八)——显示、修改、添加、删除
  6. CPU的频率、外频、倍频与超频
  7. javascript面向对象事件继承
  8. Socket 两平台互相 通信 .NET
  9. Codeforces 258 Div2
  10. Linux用户与用户组的详解
  11. C++中的析构函数
  12. SqlCommand和SqlDataAdapter有什么区别
  13. sqlplus中显示sql执行计划和统计信息
  14. iOS开发常用第三方开源框架 持续更新中...
  15. 多个测试类 只使用同一个浏览器,同一个driver对象, 或者同一个页面的对象
  16. SDL2源代码分析4:纹理(SDL_Texture)
  17. Linux内核入门到放弃-锁与进程间通信-《深入Linux内核架构》笔记
  18. hive内group by取第一条数据,Hive中row_number的使用
  19. rpm 命令使用 和 lsof -p 1406 使用
  20. JS特效实现微博评论逻辑

热门文章

  1. [转]坐在马桶上看算法:只有五行的Floyd最短路算法
  2. 20155303 2016-2017-2 《Java程序设计》第三周学习总结
  3. Spring4笔记2--Spring的第一个程序
  4. Hibernate5笔记1--Hibernate简介和第一个程序
  5. Sicily 1211. 商人的宣传
  6. Linux下编译安装qemu和libvirt【转】
  7. python3 切换工作文件夹
  8. jQuery-选择器-查找标签
  9. Vue.js 基础快速入门
  10. python基础学习之路No.3 控制流if,while,for