委派模式
委派模式(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类图
-
-
代码
-
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<String,IEmployee> targets = new HashMap<String,IEmployee>(); 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,我现在开始干登录工作
-
-
代理模式:更注重过程,什么意思呢?
- 保护被代理对象的代码
- 对被代理对象方法执行前后,进行业务处理,即增强代码
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()."); } }
- 策略模式:典型的面向接口编程,一般情况下一个接口实现类只会有一个方法,且一旦新建就不会修改,新增业务只会新建一个实现类。