设计模式系列:搞懂委派模式,委派别人干活

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

委派模式的结构:委派模式包含以下3个角色。

  1. 抽象任务角色(Task):定义任务的接口。
  2. 具体任务角色(Concrete):实现抽象任务角色的业务逻辑,是真正执行任务的角色。
  3. 委派者角色(Delegate):负责在各个具体角色之间做出决策,判断并调用具体的方法。

委派模式的通用实现:

//抽象任务角色
public interface Task {
    void doTask();
}

//具体任务角色A
public class ConcreteA implements Task{
    @Override
    public void doTask() {
        System.out.println("负责工作A!");
    }
}

//具体任务角色B
public class ConcreteB implements Task{
    @Override
    public void doTask() {
        System.out.println("负责工作B!");
    }
}

//委派者角色
public class Delegate implements Task{
    private String command;

    public Delegate(String command){
        this.command = command;
    }

    @Override
    public void doTask() {
        if("A".equals(command)){
            new ConcreteA().doTask();
        }else if("B".equals(command)){
            new ConcreteB().doTask();
        }else{
            System.out.println("无人能做该任务!!!");
        }
    }
}

//测试类
public class Test {
    public static void main(String[] args) {
        Delegate delegate = new Delegate("A");
        delegate.doTask();
    }
}

委派模式的结构图:

委派模式的应用实例:Boss给Leader下达任务,Leader根据员工的特长分配任务。

//员工接口
public interface IEmployee {
    void work(String task);
}

//员工张三
public class ZhangSan implements IEmployee{
    @Override
    public void work(String task) {
        System.out.println("我是"+task+",我擅长写软件");
    }
}

//员工李四
public class Lisi implements IEmployee{
    @Override
    public void work(String task) {
        System.out.println("我是"+task+",我擅长卖软件");
    }
}

//经理
public class Leader implements IEmployee{
    private Map<String,IEmployee> employees = new HashMap<>();

    public Leader(){
        employees.put("研发",new ZhangSan());
        employees.put("销售",new Lisi());
    }

    @Override
    public void work(String task) {
        if(employees.containsKey(task)){
            employees.get(task).work(task);
        }else{
            System.out.println(task+",干不了!!!");
        }
    }
}

//老板
public class Boss {
    public void command(Leader leader,String task){
        leader.work(task);
    }
}

//测试类
public class Test {
    public static void main(String[] args) {
        Boss boss = new Boss();
        boss.command(new Leader(),"研发");
        boss.command(new Leader(),"销售");
    }
}

上面应用实例的结构图:

委派模式在源码中的应用:ClassLoader类加载的双亲委派、SpringMVC中的dispatcherServlet。

委派模式的优点:对内隐藏实现, 易于扩展; 简化调用。

委派模式的缺点:在任务复杂的情况下需要进行多重委派,容易造成类的膨胀和紊乱,不利于管理。

委派模式的应用场景:

  1. 实现表现层和业务层之间的松耦合。
  2. 根据不同的场景调用不同的服务。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风雨编码路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值