委托模式

委托模式:故名思义,就是把自己要干的活委托给别人去干,也就是把一个对象要干的活委托给了别的对象干

举一个例子来理解这个设计模式
我们每个人都是牛马,而牛马可以干两种工作:

  1. 干管理工作
  2. 干脏活累活

所以定义一个接口:CowHorse

// 牛马接口
public interface CowHorse {
    void doDirtyWork();
    void doManageWork();
}

牛马也分等级呀,分别是:底层牛马、牛马组长,显然组长要做的事情是管理,脏活累活都要交给底层牛马来干,也就是:组长要把脏活累活“委托”给底层牛马去做

怎么做到?
底层牛马实现接口:
牛马是没有做管理工作的权限的,他只能做脏活累活,当然他还可以做自己的事情比如回家打游戏

// 底层牛马
public final class RealCowHorse implements CowHorse {
    @Override
    public void doDirtyWork() {
        System.out.println("底层牛马:我干了所有的脏活");
    }

    @Override
    public void doManageWork() {
        System.out.println("底层牛马没有权限");
    }

    public final void doOther() {
        System.out.println("底层牛马回家打游戏了");
    }
}

牛马组长实现接口:
组长要干管理的工作,但是他不想干脏活累活,所以要委托给底层牛马

// 小组长
public final class GrouperLeader implements CowHorse {
	//底层牛马可以是外部传进来的,也可以是自己创建的
	//外部传进来更具有灵活性和可扩展性
    private final CowHorse myCowHorse;

	// 创建时候传进来一个底层牛马,
    public GrouperLeader(CowHorse cowHorse) {
        this.cowHorse = cowHorse;
    }
	
	// 脏活累活 委托 给自己手下的底层牛马去做
    @Override
    public void doDirtyWork() {
    // 调用自己手下的底层牛马的相同方法做脏活
        myCowHorse.doDirtyWork();
    }
	
	// 组长自己做管理的工作
    @Override
    public void doManageWork() {
        System.out.println("组长:我要求大干三个月");
    }
	
	// 组长自己的其他事情
    public final void doOther() {
        System.out.println("去和小姨子开会");
    }
}

这里可以看到组长是怎么委托的:
即通过调用底层牛马的对应相同的方法去做的(当然他们要实现同一个接口)

下面来模拟整个工作过程:
首先,要有一个任务:

// 任务类
public final class Task {
	// 解决任务需要一个牛马
    public final void solveTask(CowHorse cowHorse) {
    	//需要牛马做管理工作 和 脏活累活
        cowHorse.doManageWork();
        cowHorse.doDirtyWork();
    }
}

其次,我们作为老板可以分配任务:

// 大boss
public final class Main {
    public static void main(String[] args) {
    	// 我们手下有一个底层牛马 叫小明
        RealCowHorse xiaoMing = new RealCowHorse();
        // 还有一个牛马组长,并把小明分配给这个组长
        GrouperLeader grouperLeader = new GrouperLeader(xiaoMing);
      	// 现在有一个任务
        Task task = new Task();
        // 让组长去解决这个任务
        task.solveTask(grouperLeader);
    }
}

此时执行后可以看到:

组长:我要求大干三个月
底层牛马:我干了所有的脏活

这样就实现了委托模式,组长干了管理的工作,并且委托底层牛马干了脏活累活

这样做的好处是什么?

  1. 简化类的职责
    通过将某些功能委托给其他类处理,可以让类的职责更加单一、清晰。
    也就是底层牛马只干脏活,组长只干管理工作
  2. 增强灵活性和扩展性
    委托模式可以动态决定将功能委托给哪个对象,使得系统具有更高的灵活性和可扩展性。
    比如:牛马小明不能胜任工作了,我们可以直接辞退小明,再招聘一个李华,把李华分配给组长,而不用修改管理的逻辑

总结

委托模式的核心优势在于通过组合而非继承,解耦功能提升复用性,适用于需要灵活扩展和动态替换功能的场景。

但是java这么写,有没有发现一个问题,如果我们有很多事情要委托,那将需要写很多低质量代码。这时候kotlin中的by关键字就发挥用场了。
下期谈一下 kotlin中的by关键字

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐