定义
委派模式是一种结构型设计模式,它允许一个对象(称为委托对象)将某些任务委派给其他对象(称为委托类),以便自己专注于更高级别的工作。在委派模式中,委托对象负责任务的分发和协调,但实际的工作由其他对象来执行。
意图
- 将对象在外部表现出特定行为的责任委托给关联的对象。
参与者(角色)
-
委托对象(Delegator): 负责分发任务的对象,它将任务委托给其他对象来执行。
-
委托接口(Delegate Interface): 委派对象所实现的接口或抽象类,定义了委托对象可以委派的任务。
-
委托类(Delegate Class): 实际执行任务的对象,它实现了委托接口,并负责完成委派对象指派的具体任务。
举例
以不同的打印机为例
类图:
这个例子中对应类的角色如下:
-
委托对象(Delegator): PrinterDelegator
-
委托接口(Delegate Interface): Printer
-
委托类(Delegate Class): CanonPrinter,EpsonPrinter,HpPrinter
Printer打印机,执行打印任务
/**
打印机
*/
public interface Printer {
void print(final String message);
}
HpPrinter
@Slf4j
public class HpPrinter implements Printer {
/**
* {@inheritDoc}
*/
@Override
public void print(String message) {
log.info("惠普打印机 : {}", message);
}
}
EpsonPrinter
@Slf4j
public class EpsonPrinter implements Printer {
/**
* {@inheritDoc}
*/
@Override
public void print(String message) {
log.info("爱普生打印机 : {}", message);
}
}
PrinterDelegator委派对象
public class PrinterDelegator implements Printer {
private Printer printer;
public PrinterDelegator(Printer printer) {
this.printer = printer;
}
public void setPrinter(Printer printer) {
this.printer = printer;
}
@Override
public void print(String message) {
printer.print(message);
}
}
测试
public class App {
private static final String MESSAGE_TO_PRINT = "委派给不同的打印机";
public static void main(String[] args) {
PrinterDelegator printerDelegator = new PrinterDelegator(new HpPrinter());
printerDelegator.print(MESSAGE_TO_PRINT);
printerDelegator.setPrinter(new CanonPrinter());
printerDelegator.print(MESSAGE_TO_PRINT);
printerDelegator.setPrinter(new EpsonPrinter());
printerDelegator.print(MESSAGE_TO_PRINT);
}
}
优点
-
降低耦合性: 委派对象与实际执行任务的对象解耦,使得两者之间的关系更加灵活。
-
集中控制: 委派对象负责任务的调度和分发,可以实现更灵活的任务管理和调度策略。
-
提高复用性: 实现了委派接口的多个委派类可以复用相同的任务执行逻辑。
缺点
- 复杂性增加: 委派模式引入了额外的类和对象,增加了代码的复杂性和维护成本。
- 灵活性受限: 委派模式在某种程度上限制了灵活性,因为它需要明确指定委派关系,导致扩展时需要修改代码。
代理模式的应用
nacos
客户端注册时,根据配置不同使用grpc或着http请求方式
分享到: