委派模式

是什么?

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

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值