委派模式

委派模式

委派模式(Delegate)原理:
类B和类A是两个互相没有任何关系的类,但是B具有和A一模一样的方法和属性;并且调用B中的方法/属性就是调用A中同名的方法和属性。


java各种设计模式之间都有共同点,比如委派模式与代理模式和策略模式有一点相像,这里介绍一下区别:

  • 委派模式:上面概念说了,A和B两个类没有任何关系,但是A和B的方法在方法名、参数、返回值一模一样。

    public class EmployeeA {
        
        public void doing(String command) {
            System.out.println("我是员工A,我现在开始干" + command + "工作");
        }
    }
    
    public class EmployeeB {
        
        public void doing(String command) {
            System.out.println("我是员工B,我现在开始干" + command + "工作");
        }
    }
    
    • UML类图

      委派模式.png
  • 代码

    • IEmployee 顶层接口

      public interface IEmployee {
      
          public void doing(String command);
      
      }
      
    • IEmployeeA 员工A实现顶层接口

      public class EmployeeA implements IEmployee {
          @Override
          public void doing(String command) {
              System.out.println("我是员工A,我现在开始干" + command + "工作");
          }
      }
      
    • IEmployeeA 员工B实现顶层接口

      public class EmployeeB implements IEmployee {
          @Override
          public void doing(String command) {
              System.out.println("我是员工B,我现在开始干" + command + "工作");
          }
      }
      
    • Leader 项目经理

      public class Leader implements IEmployee {
      
          private Map targets = new HashMap();
        
          public Leader() {
              targets.put("加密",new EmployeeA());
              targets.put("登录",new EmployeeB());
          }
      
          //项目经理自己不干活
          public void doing(String command){
              targets.get(command).doing(command);
          }
      
      }
      
    • Boss 老板提出需求

      public class Boss {
      
          public void command(String command,Leader leader){
              leader.doing(command);
          }
      
      }
      
    • DelegateTest 测试类

      public class DelegateTest {
      
          public static void main(String[] args) {
      
              //客户请求(Boss)、委派者(Leader)、被委派者(IEmployee)
              //委派者要持有被委派者的引用
              //代理模式注重的是过程, 委派模式注重的是结果
              //策略模式注重是可扩展(外部扩展),委派模式注重内部的灵活和复用
              //委派的核心:就是分发、调度、派遣
      
              //委派模式:就是静态代理和策略模式一种特殊的组合
      
              new Boss().command("登录",new Leader());
      
          }
      
      }
      
    • 输出

      我是员工B,我现在开始干登录工作
      
  • 代理模式:更注重过程,什么意思呢?

    1. 保护被代理对象的代码
    2. 对被代理对象方法执行前后,进行业务处理,即增强代码
    public class Proxy implements Subject {
    
        private Subject subject;
    
        public Proxy(Subject subject){
            this.subject = subject;
        }
        public void request() {
            //执行前
            before();
            //执行被代理类
            subject.request();
            //执行后
            after();
        }
      
        public void before(){
            System.out.println("called before request().");
        }
    
        public void after(){
            System.out.println("called after request().");
        }
    }
    
  • 策略模式:典型的面向接口编程,一般情况下一个接口实现类只会有一个方法,且一旦新建就不会修改,新增业务只会新建一个实现类。

你可能感兴趣的:(委派模式)