责任链模式

1.天然的责任链:公司的层级结构
sales-manager-director-vice pesident-ceo
2.责任链模式:将接受者对象连成一条链,并在该链上传递请求,直到有一个接受者对象处理它。 通过让更多对象有机会处理请求,避免了请求发送者和接受者之间的耦合
3.责任链模式图
 发送的客户端代码并不知道链上的哪个接收者会处理这个请求,从而实现了客户端和接收者之间的解耦
4,.好处
开闭原则:新增开放,修改关闭
执行性能:创建多个处理器对象,其实只是少数处理器对象会用到
5.应用
    
    
  1. package com.imooc.pattern.cor.handler;
  2. //价格处理人,负责处理客户折扣申请
  3. public abstract class PriceHandler {
  4. /**
  5. * 直接后继,用于传递请求
  6. */
  7. protected PriceHandler successor;
  8. public void setSuceessor(PriceHandler successor) {
  9. this.successor = successor;
  10. }
  11. /**
  12. * 处理折扣申请
  13. */
  14. public abstract void processDiscount(float discount);
  15. }
     
     
  1. package com.imooc.pattern.cor.handler;
  2. public class Sales extends PriceHandler {
  3. @Override
  4. public void processDiscount(float discount) {
  5. if(discount < 0.05){
  6. System.out.format("%s批准了折扣:%.2f%n", this.getClass().getName(),discount);
  7. }else{
  8. successor.processDiscount(discount);
  9. }
  10. }
  11. }
      
      
  1. package com.imooc.pattern.cor.handler;
  2. public class Lead extends PriceHandler {
  3. @Override
  4. public void processDiscount(float discount) {
  5. if(discount < 0.15){
  6. System.out.format("%s批准了折扣:%.2f%n", this.getClass().getName(),discount);
  7. }else{
  8. successor.processDiscount(discount);
  9. }
  10. }
  11. }
       
       
  1. package com.imooc.pattern.cor.handler;
  2. public class Manager extends PriceHandler {
  3. @Override
  4. public void processDiscount(float discount) {
  5. if(discount < 0.3){
  6. System.out.format("%s批准了折扣:%.2f%n", this.getClass().getName(),discount);
  7. }else{
  8. successor.processDiscount(discount);
  9. }
  10. }
  11. }
        
        
  1. package com.imooc.pattern.cor.handler;
  2. public class Director extends PriceHandler {
  3. @Override
  4. public void processDiscount(float discount) {
  5. if(discount < 0.15){
  6. System.out.format("%s批准了折扣:%.2f%n", this.getClass().getName(),discount);
  7. }else{
  8. successor.processDiscount(discount);
  9. }
  10. }
  11. }
         
         
  1. package com.imooc.pattern.cor.handler;
  2. public class VicePresident extends PriceHandler {
  3. @Override
  4. public void processDiscount(float discount) {
  5. if(discount < 0.5){
  6. System.out.format("%s批准了折扣:%.2f%n", this.getClass().getName(),discount);
  7. }else{
  8. successor.processDiscount(discount);
  9. }
  10. }
  11. }
          
          
  1. package com.imooc.pattern.cor.handler;
  2. public class PriceHandlerFactory {
  3. /**
  4. * 创建priceHandler的工厂方法
  5. * @return
  6. */
  7. public static PriceHandler createPriceHandler() {
  8. PriceHandler sales = new Sales();
  9. PriceHandler lead = new Lead();
  10. PriceHandler man = new Manager();
  11. PriceHandler director = new Director();
  12. PriceHandler vp = new VicePresident();
  13. PriceHandler ceo = new Ceo();
  14. sales.setSuceessor(lead);
  15. lead.setSuceessor(man);
  16. man.setSuceessor(director);
  17. director.setSuceessor(vp);
  18. vp.setSuceessor(ceo);
  19. return sales;
  20. }
  21. }
           
           
  1. package com.imooc.pattern.cor;
  2. import java.util.Random;
  3. import com.imooc.pattern.cor.handler.PriceHandler;
  4. import com.imooc.pattern.cor.handler.PriceHandlerFactory;
  5. public class Customer {
  6. private PriceHandler priceHandler;
  7. public void setPriceHandler(PriceHandler priceHandler) {
  8. this.priceHandler = priceHandler;
  9. }
  10. public void requestDiscount(float discount){
  11. priceHandler.processDiscount(discount);
  12. }
  13. public static void main(String[] args) {
  14. Customer customer = new Customer();
  15. customer.setPriceHandler(PriceHandlerFactory.createPriceHandler());
  16. Random rand = new Random();
  17. for(int i=0; i<100; i++){
  18. System.out.println(i+":");
  19. customer.requestDiscount(rand.nextFloat());
  20. }
  21. }
  22. }






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值