一文搞懂:委托设计模式
委托模式
委托模式:故名思义,就是把自己要干的活委托给别人去干,也就是把一个对象要干的活委托给了别的对象干
举一个例子来理解这个设计模式 我们每个人都是牛马,而牛马可以干两种工作:
干管理工作干脏活累活
所以定义一个接口: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关键字