委派模式(Delegate Pattern)简介

定义

委派模式又叫委托模式,是一种面向对象的设计模式,允许对象组合实现与继承相同的代码重用。它的基本作用就是负责任务的调用和分配任务,是一种特殊的静态代理,可以理解为全权代理,但是代理模式注重过程,而委派模式注重结果。委派模式属于行为型模式,不属于GOF23种设计模式中。

应用场景

1、委派对象本身不知道如何处理一个任务或请求,而交给其他对象来处理;
2、实现程序的解耦

代码实现

public class Boss {
     
    public void command(String task,Leader leader){
     
        leader.doing(task);
    }
}
public interface IEmployee {
     
    void doing(String task);
}
public class Leader implements IEmployee {
     

    private Map<String,IEmployee> employee = new HashMap<String,IEmployee>();

    public Leader(){
     
        employee.put("爬虫",new EmployeeA());
        employee.put("海报图",new EmployeeB());
    }

    public void doing(String task) {
     
        if(!employee.containsKey(task)){
     
            System.out.println("这个任务" +task + "超出我的能力范围");
            return;
        }
        employee.get(task).doing(task);
    }
}
public class EmployeeA implements IEmployee {
     
    protected String goodAt = "编程";
    public void doing(String task) {
     
        System.out.println("我是员工A,我擅长" + goodAt + ",现在开始做" +task + "工作");
    }
}
public class EmployeeB implements IEmployee {
     
    protected String goodAt = "平面设计";
    public void doing(String task) {
     
        System.out.println("我是员工B,我擅长" + goodAt + ",现在开始做" +task + "工作");
    }
}
public class Test {
     
    public static void main(String[] args) {
     
        new Boss().command("海报图",new Leader());
        new Boss().command("爬虫",new Leader());
        new Boss().command("卖手机",new Leader());
    }
}

结果如下:
委派模式(Delegate Pattern)简介_第1张图片

源码中的应用

JDK中有一个典型的委派,JVM在加载类是用的双亲委派模型,一个类加载器在加载类时,先把这个请求委派给自己的父类加载器去执行,如果父类加载器还存在父类加载器,就继续向上委派,直到顶层的启动类加载器。如果父类加载器能够完成类加载,就成功返回,如果父类加载器无法完成加载,那么子加载器才会尝试自己去加载;Spring中BeanDefinitionParserDelegate 根据不同类型委派不同的逻辑解析BeanDefinition;SpringMVC的DispatcherServlet会查询一个或多个处理器映射(handler mapping)并根据请求所携带的URL信息进行决策,将请求发送给相应的控制器(controller);

优缺点

优点:
通过任务委派能够将一个大型的任务细化,然后通过统一管理这些子任务的完成情况实现任务的跟进,能够加快任务执行的效率。
缺点:
任务委派方式需要根据任务的复杂程度进行不同的改变,在任务比较复杂的情况下可能需要进行多重委派,容易造成紊乱。

你可能感兴趣的:(设计模式,java)