古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
个人CSND主页——Micro麦可乐的博客
《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~
委派模式(Delegate Pattern)是一种软件设计模式,它允许一个对象(委派者)将任务委派给其他对象(委派对象)来执行,以实现任务的分发和处理。跟代理模式有点像,但是代理模式注重过程,而委派模式注重结果,我们可以认为委派模式就是一种特殊情况下的静态全权代理,比如Spring中大家熟悉的DispatcherServlet
在生活场景中,可以通过以下例子来说明委派模式:
假设目前你是三口之家,妈妈、孩子、爸爸、宠物狗,首先我们都需要认清爸爸在家庭的弟位,孩子 > 妈妈 > 爸爸=宠物狗
;
在这个场景中,妈妈是委派者,负责接收孩子需求并分配给爸爸处理。而爸爸是委派对象,他根据妈妈的指示负责处理各个方面的生活安排。比如洗衣、做饭、拖地程等。
这种委派模式的好处是,妈妈可以集中精力照顾孩子这个小祖宗,而将具体的任务分配给爸爸来完成。委派对象也能更加专注地处理自己擅长的任务,提高工作效率和质量(说白了爸爸就要求什么都会 )。
上面一家三口案例中,我们使用JAVA代码来给大家演示一下
/**
* 定义工作接口
*/
public interface Worker {
void doing(String thing);
}
创建委派对象爸爸和狗狗
/**
* 委派对象 爸爸
*/
public class Father implements Worker {
@Override
public void doing(String thing) {
System.out.println("爸爸开始完成妈妈委托: " + thing);
// 具体的任务处理逻辑
// ...
}
}
/**
* 委派对象 狗狗
*/
public class Dog implements Worker {
@Override
public void doing(String thing) {
System.out.println("狗狗开始完成妈妈委托: " + thing);
// 具体的任务处理逻辑
// ...
}
}
创建妈妈角色
/**
* 定义妈妈 委派者
*/
public class Mother implements Worker {
private static Map<String, Worker> workerMap = new HashMap<>();
public Mother() {
workerMap.put("cooking", new Father());
workerMap.put("play", new Dog());
}
/**
* 做事情
*
* @param thing 委派任务名
*/
@Override
public void doing(String thing) {
System.out.println("我是妈妈,小祖宗Boss派活了: " + thing + ",我来指定委派任务: " + thing);
if (workerMap.containsKey(thing)) {
workerMap.get(thing).doing(thing);
} else {
System.err.println("目前没有可以指派的委派对象");
}
}
}
创建孩子角色 - BOSS
/**
* 小孩(老板)
*/
public class Boss {
private Mother mother;
public void setMother(Mother mother) {
this.mother = mother;
}
public void command(String thing) {
System.out.println("我是小祖宗,我现在需要: " + thing);
mother.doing(thing);
}
}
最后测试类
public class DelegatePatternTest {
public static void main(String[] args) {
//创建孩子啊 小祖宗
Boss boss = new Boss();
// 爸爸做饭
boss.setMother(new Mother());
boss.command("cooking");
System.out.println("================================");
// 狗狗陪玩
boss.command("play");
}
}
上面我们就提到了Spring中的DispatcherServlet
就使用了委派模式。
前端请求都统一由 DispatcherServlet
的 doService()
方法处理,然后在 doService()
方法中调用 doDispatch()
方法,在 doDispatch()
方法中,进行复杂的任务进行分解,分发执行并通过一个委派者角色,会获取业务处理的 handler ,执行 handle() 方法处理请求结果。
其实还有很多地方都使用到了委派模式,代码中一般 Delegate
、Dispatcher
结尾的都是委派类。大家可以搜索Spring源码查阅
在软件设计中,委派模式可以帮助实现任务的分发和协调,使得代码结构更加清晰和可维护。委派者负责接收任务请求并选择合适的委派对象来处理,而委派对象则负责具体的任务执行。这种模式可以将任务分解,实现任务的解耦和灵活性,同时提高代码的可重用性和可扩展性。
总结起来,委派模式是一种通过将任务委派给其他对象来实现任务分发和处理的设计模式。它可以在生活场景中,例如旅行社经理委派员工安排旅行活动,或在软件设计中,实现任务的解耦和协调。
样例代码:https://github.com/lhmyy521125/toher-designmode