是什么?
1.在常用的23种设计模式中其实面没有委派模式(delegate)的影子,但是在Spring中委派模式确实用的比较多的一种模式,Spring MVC框架中的DispatcherServlet其实就用到了委派模式,有前辈将其总结为代理模式和策略模式的组合 ;
2.我们在项目开发中都是一个项目团队,老板把任务交给项目经理后,项目经理制定项目计划、将任务下发到底下的开发人员,这就是委派模式。但是我们发现这个跟之前学的代理模式非常相似,其实这也可以当做是静态代理模式的一种特例。此外,项目经理接到任务后会做一个权衡,怎么去选择分配这些任务。我们又发现这个跟之前学的策略模式非常相似,其实这也可以当做是策略模式的一种特例;
3.委派模式跟静态代理模式以及策略模式的区别?
委派模式:代理人全权负责这一件事。如:老板给项目经理安排任务,项目经理只是负责调度工作,真正干活的是底下的开发人员。
静态代理模式:代理人只是参与被代理人一小部分的工作,最终的结论还是得由代理人来决定。如:张三没空找对象,媒婆帮张三物色到一个对象,最终得看张三喜不喜欢这个对象。
策略模式:项目经理在分配任务的时候需要权衡,会产生多种分配方案,但是最终都是将手中的任务分配给底下的开发人员。
为什么?
委派模式(Delegate)是面向对象设计模式中常用的一种模式。这种模式的原理为类B和类A是两个互相没有任何关系的类,B具有和A一模一样的方法和属性;并且调用B中的方法,属性就是调用A中同名的方法和属性。B好像就是一个受A授权委托的中介。第三方的代码不需要知道A的存在,也不需要和A发生直接的联系,通过B就可以直接使用A的功能,这样既能够使用到A的各种公能,又能够很好的将A保护起来了;
怎么办?
demo1:
package com.xxq.pattern.demo.deltegate;
/**
* 一. 定义抽象任务角色接口
* 抽象任务角色
* @author Administrator
*
*/
public interface Task {
void doTask();
}
package com.xxq.pattern.demo.deltegate;
/**
* 二. 具体任务角色, 实现上面的接口,
* 具体实现类A
*
* @author Administrator
*
*/
public class ConcreteTaskA implements Task {
@Override
public void doTask() {
System.out.println("执行 , 由B实现");
}
}
package com.xxq.pattern.demo.deltegate;
/**
* 二. 具体任务角色, 实现上面的接口,
* 具体实现类B
*
* @author Administrator
*
*/
public class ConcreteTaskB implements Task {
@Override
public void doTask() {
System.out.println("执行 , 由B实现");
}
}
package com.xxq.pattern.demo.deltegate;
import java.util.Random;
/**
* 代理角色
* https://yq.aliyun.com/articles/641932
* 优点: 对内隐藏实现, 易于扩展; 简化调用;
* 委派模式大量使用在spring,mybatis等开源框架中, 理解委派模式的实现原理可以更好理解这些框架源码.
* 委派模式的核心是委派类的实现.
* @author Administrator
*
*/
public class TaskDelegate implements Task {
@Override
public void doTask() {
System.out.println("代理执行开始....");
Task task = null;
if (new Random().nextBoolean()) {
task = new ConcreteTaskA();
task.doTask();
} else {
task = new ConcreteTaskB();
task.doTask();
}
System.out.println("代理执行完毕....");
}
}
package com.xxq.pattern.demo.deltegate;
public class TaskTest {
public static void main(String[] args) {
new TaskDelegate().doTask();
}
}
demo2
package com.xxq.pattern.demo.deltegate2;
/**
* 普通员工接口
* @author Administrator
*
*/
public interface ITarget {
public void doing(String command);
}
package com.xxq.pattern.demo.deltegate2;
/**
* 员工A
* @author Administrator
*
*/
public class TargetA implements ITarget {
@Override
public void doing(String command) {
System.out.println("开始进行加密算法的实现");
}
}
package com.xxq.pattern.demo.deltegate2;
/**
* 员工B
* @author Administrator
*
*/
public class TargetB implements ITarget{
@Override
public void doing(String command) {
System.out.println("开始开发销售代码");
}
}
package com.xxq.pattern.demo.deltegate2;
import java.util.HashMap;
import java.util.Map;
/**
* 项目经理(委派者)
* @author Administrator
*
*/
public class Leader {
private Map<String, ITarget> targets = new HashMap<String, ITarget>();
public Leader() {
targets.put("加密", new TargetA());
targets.put("销售", new TargetB());
}
public void dispatcher(String command) {
targets.get(command).doing(command);
}
}
package com.xxq.pattern.demo.deltegate2;
/**
* 老板要经理做事情; Spring
* MVC框架中的DispatcherServlet其实就是用到的委派模式,针对之前的MVC执行流程无法理解的HandlerMapping其实就是这里的项目经理维护的各个员工的信息。
* 上述实例中,为了简单,直接在构造函数中维护了相关实例的引用,但是在具体的HandlerMapping中,这一步显然要复杂的多,这个后期手动实现MVC框架的时候再进行深入探讨。
*
*
* @author Administrator
*
*/
public class BossTest {
public static void main(String[] args) {
new Leader().dispatcher("销售");
new Leader().dispatcher("加密");
}
}
参考资料:
https://blog.csdn.net/liman65727/article/details/79720352
https://blog.csdn.net/fu123123fu/article/details/80159551
https://blog.csdn.net/fu123123fu/article/details/80159551