我们大家都知道,设计模式来源于生活,而且使用的时候都是混合使用的,而今天的委派模式就更符合这两个特点。
一.什么是委派模式?
其实我个人的理解就是一个特殊的静态代理模式,只不过加入了策略模式,我们看下面的图。
这个图就更形象的说明了委派模式,企业的老板BOSS,他不懂技术,但是他手下有个研发经理leader,研发经理手下有2个员工。BOSS想做一个需求,他直接和研发经理leader说就可以,BOSS不用关心要怎么实现也不用关心是谁去做这件事。
说到这里,其实大家也能看出来,这是一个静态代理,而leader就是代理类,而区别就是leader里面有一个策略,也可以简单的理解为if..else..
二.什么时候用委派模式呢?
spring mvc里面用委派模式比较多,比如DispatcherServlet前端控制器,那用户在浏览器页面输入地址,它是怎么找到后台对应的controller里的方法呢?
我们可以把用户输入的URL看成是BOSS,而我们的DispatcherServlet相当于是leader,它可以根据BOSS也就是URL找到不一样的员工也就是controller。
所以,我觉得委派模式只是在特殊的业务场景里使用,并且该业务需求几乎是不在变化的,不拓展也不修改。并且你想把代码保护起来,对外只提供一个策略类,供外部调用,也可以用委派模式。
三.优缺点:
1.优点:对内隐藏实现, 易于扩展; 简化调用。
2.缺点:和静态代理的一样,当如果员工和leader类拓展的时候容易膨胀,难于管理。
四.怎么实现?
1.首先定义一个抽象任务类
public interface Working {
void doing(String content);
}
2.定义2个员工类去实现抽象任务类
public class EmployeeA implements Working{
@Override
public void doing(String content) {
System.out.println("员工A做"+content);
}
}
public class EmployeeB implements Working {
@Override
public void doing(String content) {
System.out.println("员工B做"+content);
}
}
3.定义一个leader类,其是核心类
public class Leader implements Working {
private Map map=new HashMap<>();
public Leader(){
map.put("登录",new EmployeeA());
map.put("注册",new EmployeeB());
}
@Override
public void doing(String content) {
map.get(content).doing(content);
}
}
这里其实我个人觉得不用实现接口Working,里面的逻辑就是一个策略,我们外部BOSS调用直接调用leader即可,它会根据传参,来决定去调用员工A还是B。
4.调用(BOSS类)
public static void main(String[] args) {
Leader leader = new Leader();
leader.doing("注册");
}
以上就是一个委派模式,那么它和静态代理有什么区别呢?刚才也说过,代理类leader可以不用实现Working,而静态代理的代理类和被代理类都要去实现这个任务接口。更形象的话讲就是委派模式,老板不用会敲代码,而静态代理的老板是需要会敲代码的,但是他不敲。
委派模式注重结果,BOSS给研发经理一个目标,只要完成就行,不关注过程,而且看似调用的是研发经理leader类,实则干活的是底下的员工A和B。
以上就是我个人理解的一个委派模式。