设计模式之委派模式

1、定义

委派模式(Delegate Pattern)又叫委托模式。它的基本作用就是负责任务的调度和任务的分配,将任务的分配和执行分离开来。可以看做是一种特殊情况下的静态代理的全权代理。

不属于23中设计模式。

属于行为型模式

2、应用场景

1、委派对象本身不知道如何处理一个任务或一个请求,吧请求交给其他对象来处理。

2、实现程序的解耦。

3、组成

抽象任务角色(Task):定义一个抽象接口,他有若干个实现类;

委派者角色(Delegate):负责在各个具体角色势力之间做出决策,并判断调用具体实现的方法;

具体人物角色(Concrete):真正执行任务的角色。

现实中的委派模式:老板(Boss)给项目经理(Leader)下达任务,项目经理会根据实际情况给每个员工分发任务,员工完成任务后,再有项目经理吧结果报告给老板。

4、实际业务场景中的应用

类图:

设计模式之委派模式_第1张图片

代码:

public class Boss {
     
    public void command(String task,Leader leader){
     
        leader.doWork(task);
    }
}

// 员工抽象类=======================================
public interface IEmployee {
     
    void doWork(String task);
}

// 员工A===========================================
public class EmployeeA implements IEmployee {
     
    protected String goodAt = "软件开发";
    @Override
    public void doWork(String task) {
     
        System.out.println("员工A擅长的领域是:" + goodAt + ",分配的任务是:" + task +"开发");
    }
}

// 员工B===========================================
public class EmployeeB implements IEmployee {
     
    protected String goodAt = "销售";
    @Override
    public void doWork(String task) {
     
        System.out.println("员工B擅长的领域是:" + goodAt + ",分配的任务是:" + task);
    }
}

// 项目经理=========================================
public class Leader implements IEmployee {
     

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

    public Leader(){
     
        employeeMap.put("Java", new EmployeeA());
        employeeMap.put("销售软件", new EmployeeB());
    }
    @Override
    public void doWork(String task) {
     
        if(employeeMap.containsKey(task)){
     
            employeeMap.get(task).doWork(task);
        }else {
     
            System.out.println("任务分配失败,没有员工可以完成此业务");
        }
    }
}

测试:

public class Test{
     
    public static void main(String[] args) {
     
        Boss boss = new Boss();
        Leader leader = new Leader();
        // 老板布置任务给经理
        boss.command("Java",leader);
        boss.command("销售软件",leader);
        boss.command("页面优化",leader);
    }
}
// 结果==========================================
员工A擅长的领域是:软件开发,分配的任务是:Java开发
员工B擅长的领域是:销售,分配的任务是:销售软件
任务分配失败,没有员工可以完成此业务

5、源码中的应用

JVM类加载机制:双亲委派机制。

双亲委派:指一个类加载器去加载类时,优先会把请求委派给自己的父类去执行,如果父类加载器还存在父类,就会继续往上委派,直到顶层的类加载器。如果加载成功就不会再执行。如果父类没有加载成功就只能本身去执行。避免类的重复加载。

反射中常用的类Method:invoke(Object,args)方法。

Spring中委派模式的应用:BeanDefinition类,用来封装配置信息在内存中的状态。

DispatcherServlet类,service()方法中的doDispatch()方法

6、优点

通过任务委派能够将一个大型任务细化,然后通过统一管理这些子任务的完成情况实现任务的跟进,能够加快任务执行效率。

7、缺点

任务委派模式需要根据任务的复杂度进行不同的改变,在任务比较复杂的情况下可能需要进行多重委派,容易造成紊乱。

8、委派模式与代理模式区别

1、委派模式是行为型模式,代理模式是结构型模式;

2、委派模式注重的是任务派遣,注重结果;

​ 代理模式注重的是代码增强,注重过程。

3、委派模式是一种特殊的静态代理,相当于全权代理。

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