允许对象组合实现与继承相同的代码重用,负责任务的调用和分配
只对结果负责。
优点
通过任务委派能够将一个大型的任务细化,然后通过统一管理这些子任务的完成情况实现任务的跟进,能够加快任务执行的效率。
缺点
任务委派方式需要根据任务的复杂程度进行不同的改变,在任务比较复杂的情况下可能需要进行多重委派,容易造成紊乱。
应用场景
-
当你要实现表现层和业务层之间的松耦合的时候。
-
当你想要编排多个服务之间的调用的时候。
-
当你想要再封装一层服务查找和调用时候
/**
* 抽象任务角色
*/
public interface Task {
void doTask();
}
/**
* 具体实现类A
*/
public class ConcreteTaskA implements Task {
public void doTask() {
System.out.println("执行 , 由A实现");
}
}
/**
* 具体实现类B
*/
public class ConcreteTaskB implements Task {
public void doTask() {
System.out.println("执行 , 由B实现");
}
}
/**
* 代理角色
*/
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("代理执行完毕....");
}
}
public class TaskTest {
public static void main(String[] args) {
new TaskDelegate().doTask();
}
}
JDK源码中委派模式体现
一个类加载器在加载类时,先把这个请求委派给自己的父类加载器去执行,如果父类加载器还存在父类加载器,就继续向上委派,直到顶层的启动类加载器。
如果父类加载器能过完成类加载,就成功返回。如果父类加载器无法完成加载,那么子加载器才会尝试自己去加载。从定义中可看出双亲加载模型一个类加载器加载类时,首先不是自己加载,而是委派给父加载器。
public abstract class ClassLoader {
//......中间代码省略
// The parent class loader for delegation
// Note: VM hardcoded the offset of this field, thus all new fields
// must be added *after* it.
private final ClassLoader parent;
//.....中间代码省略
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// First, check if the class has already been loaded
Class<?> c = findLoadedClass(name);
if (c == null) {
long t0 = System.nanoTime();
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
// ClassNotFoundException thrown if class not found
// from the non-null parent class loader
}
if (c == null) {
// If still not found, then invoke findClass in order
// to find the class.
long t1 = System.nanoTime();
c = findClass(name);
// this is the defining class loader; record the stats
sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
sun.misc.PerfCounter.getFindClasses().increment();
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
}
}
根据以下文章总结:
-
Java设计模式:23种设计模式全面解析(超级详细)HYPERLINK http://c.biancheng.net/design_pattern/
-
Android系统编程思想:设计模式android-open-source-project-analysis/02Android系统软件设计篇:设计模式.md at master · sucese/android-open-source-project-analysis · GitHub
-
设计模式 https://blog.youkuaiyun.com/shusheng0007/category_8638565.html
-
java设计模式 https://blog.youkuaiyun.com/qq_37909508/category_8976362.html
-
设计模式 https://www.cnblogs.com/zuoxiaolong/category/509144.html
-
设计模式 在源码中的应用 https://blog.youkuaiyun.com/qq_36970993/category_10620886.html
-
Android系统设计中存在设计模式分析 https://www.2cto.com/kf/201208/150650.html
-
Android设计模式系列 - 基于android的各种代码分析各种设计模式 https://www.cnblogs.com/qianxudetianxia/category/312863.html