代理模式 委派模式 策略模式_学习笔记之委派模式

我们大家都知道,设计模式来源于生活,而且使用的时候都是混合使用的,而今天的委派模式就更符合这两个特点。

一.什么是委派模式?

其实我个人的理解就是一个特殊的静态代理模式,只不过加入了策略模式,我们看下面的图。

这个图就更形象的说明了委派模式,企业的老板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。

以上就是我个人理解的一个委派模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值