世界杯举办地_世界杯预选赛巴西 - emsxbc.com

一文搞懂:委托设计模式

委托模式

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

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

干管理工作干脏活累活

所以定义一个接口: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);

}

}

此时执行后可以看到:

组长:我要求大干三个月

底层牛马:我干了所有的脏活

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

这样做的好处是什么?

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

总结

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

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