Java中的责任链模式

来源:互联网 发布:淘宝女外套 编辑:程序博客网 时间:2024/04/19 07:46

1、责任链模式:


       将接收者对象连成一条链,并在该链上传递请求,直到有一个接收者对象处理它。通过让更多有机会处理请求,避免了请求发送者和接收者之间的耦合。

        在责任连模式中,作为请求接收者的多个对象通过对其后继的引用而连接起来形成一条链。请求在这条链上传递,直到链上某一个接收者处理这个请求。每个接收者可以自行选择处理这个请求或向后继传递这个请求。

2、责任链模式的实现:

package com.practice.cor.handler;


/*
 * 价格处理人,负责处理客户折扣申请
 */
public abstract class PriceHandler {


protected PriceHandler successor;


/*
* 直接后继,用于传递请求
*/
public void setSuccessor(PriceHandler successor) {
this.successor = successor;
}

/*
* 处理折扣申请
*/
public abstract void processDiscount(float discount);
}


package com.practice.cor.handler;


/*
 * 销售,可以批准5%以内的折扣
 */
public class Sales extends PriceHandler {


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


}


package com.practice.cor.handler;


/*
 * CEO,可以批准55%以内的折扣
 * 折扣超出55%,就拒绝申请
 */
public class CEO extends PriceHandler {


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


}


}


package com.practice.cor.handler;


/*
 * 销售经理,可以批准30%以内的折扣
 */
public class Manager extends PriceHandler {


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


}


}


package com.practice.cor.handler;


/*
 * 销售副总裁,可以批准50%的折扣
 */
public class VicePresident extends PriceHandler {


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


}


}


package com.practice.pattern;


import java.util.Random;


import com.practice.cor.handler.PriceHandler;


/*
 * 客户,申请折扣
 */
public class Customer {


private PriceHandler priceHandler;

public void setPriceHandler(PriceHandler priceHandler) {
this.priceHandler = priceHandler;
}


public void requestDiscount(float discount){
priceHandler.processDiscount(discount);
}

public static void main(String[] args) {
Customer customer = new Customer();
customer.setPriceHandler(PriceHandlerFactory.createPriceHandler());

Random random = new Random();
for (int i = 0; i < 100; i++) {
System.out.println(i+":");
customer.requestDiscount(random.nextFloat());
}
}
}


package com.practice.pattern;


import com.practice.cor.handler.CEO;
import com.practice.cor.handler.Manager;
import com.practice.cor.handler.PriceHandler;
import com.practice.cor.handler.Sales;
import com.practice.cor.handler.VicePresident;


public class PriceHandlerFactory {


/*
* 创建PriceHandler的工厂方法
*/
public static PriceHandler createPriceHandler() {
PriceHandler sales = new Sales();
PriceHandler man = new Manager();
PriceHandler vp = new VicePresident();
PriceHandler ceo = new CEO();

sales.setSuccessor(man);
man.setSuccessor(vp);
vp.setSuccessor(ceo);
return sales;
}


}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 6楼层顶墙边漏水怎么办 信访三级终结后怎么办 领导安排工作不合理怎么办 老板不安排工作怎么办 孩子啃老父母怎么办 孩子变成讨好形怎么办 工厂破产了工资怎么办 失业就业登记证怎么办? 如果父母是教师怎么办 老人档案丢了怎么办 想离婚想要孩子怎么办 一二年级成绩差怎么办 高考复读又失败怎么办 孩子不想估成绩怎么办 手机信号被屏蔽了怎么办 西安市旅游年卡怎么办 广电宽带网速慢怎么办 电视智能卡坏了怎么办 家乐卡二次授信怎么办? 邢台银行倒闭了怎么办 不敢和导师交流怎么办 考上一个破大学怎么办 腻子粉检测报告怎么办 电子厂插件很慢怎么办 预付费电表跳闸怎么办 电费有疑问怎么办大连 农村电表箱坏了怎么办 农村电表没电怎么办 家里电费特别高怎么办 电表读卡失败怎么办 电表卡消磁了怎么办 智能表采集失败怎么办 电脑没有蓝牙功能怎么办 判决后无力偿还怎么办 dz47-63c63跳闸怎么办 租房合同丢了怎么办 北京土地承包合同丢失怎么办 租赁合同丢失了怎么办 房屋租赁合同丢失怎么办 学校没发学生证怎么办 学校银行卡丢了怎么办