定义
英文拼写为:Chain Of Responsibility
Handler Chain 每个元素
Handler Chain 每个元素
责任链模式定义:将接受者对象连成一条链,并在该链上传递请求,直到有一个接受者对象处理它。通过让更多的对象有机会处理请求,避免了请求发送者和接受者之间的耦合。
特点:可以简单解耦
但是时间和内存上会有一定消耗
观察者模式后来取代了这种的模式
举例
天然的责任链 : 公司的层级结构
销售公司:CEO、经理、组长、销售者
代码详解
父类:价格Handler
public abstract class PriceHandler {
//后继者
protected PriceHandler successor;
public void setSuccessor(PriceHandler successor) {
this.successor = successor;
}
/*
* 可以决策的折扣
*/
public abstract void processDiscount(float discount);
}
public class Sales extends PriceHandler {
@Override
public void processDiscount(float discount) {
if(discount <= 0.05){
System.out.format("%s 批准了折扣 :0.2f%n", this.getClass().getName(), discount);
}else{
successor.processDiscount(discount);
}
}
}
public class Leader extends PriceHandler {
@Override
public void processDiscount(float discount) {
if(discount <= 0.3){
System.out.format("%s 批准了折扣 :0.2f%n", this.getClass().getName(), discount);
}else{
successor.processDiscount(discount);
}
}
}
经理
public class Manager extends PriceHandler {
@Override
public void processDiscount(float discount) {
if(discount <= 0.4){
System.out.format("%s 批准了折扣 :0.2f%n", this.getClass().getName(), discount);
}else{
successor.processDiscount(discount);
}
}
}
CEO
public class CEO extends PriceHandler {
@Override
public void processDiscount(float discount) {
if(discount <= 0.6){
System.out.format("%s 批准了折扣 :0.2f%n", this.getClass().getName(), discount);
}else{
successor.processDiscount(discount);
}
}
}
使用工厂模式生产出这些对象并指定后继者
public class PriceHandlerFactory {
public static PriceHandler createPriceHandler() {
PriceHandler sales = new Sales();
PriceHandler man = new Manager();
PriceHandler ceo = new CEO();
sales.setSuccessor(man);
man.setSuccessor(ceo);
return sales;
}
}
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 rand = new Random();
for(int i=1;i<=10;i++){
System.out.print(i+":");
customer.requestDiscount(rand.nextFloat());
}
}
}
所以,客户并不想知道谁给了批准折扣,只需要关心结果。完成了一定程度的解耦。
后记
如有任何疑问或者错误等,欢迎评论、指出。谢谢!