设计模式-装饰器模式
1、定义 :
在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能)。
2、优点:
装饰器是继承的有力补充,比继承灵活,不改变原有对象的情况下动态的给一个对象扩展功能,即插即用;
通过使用不同装饰类以及这些装饰类的排列组合,可实现不同效果;
装饰器完全遵守开闭原则。
3、缺点:
会出现更多的代码,更多的类,增加程序复杂性;
动态装饰时,多层装饰时会更复杂。
4、适用场景:
用于扩展一个类的功能或给一个类添加附加职责;
动态的给一个对象添加功能,这些功能可以再动态的撤销。
5、类图:
6、装饰器模式中的角色:
- 抽象构建角色(Component):Component是一个抽象类或接口,是要包装的原始对象。
- 具体构建角色(BaseComponent):是Component的实现类,最终要装饰的实际对象。
- 装饰器角色(Decorator):是一个抽象类,继承或实现了Component的接口,同事它持有一个对Component实例对象的引用,也可以有自己的方法。
- 具体装饰角色(ConcreteDecorator):是Decorator的实现类,是具体的装饰器对象,负责给BaseComponent附加责任。
7、代码示例:(动态设置监控考勤设备的例子,本例子纯属虚构)
监控考勤设备的方式如下:
- 监控考勤设备是否正常工作(基本)
- 监控考勤设备考勤数量是否正常(假如工作日平局每天考勤人数大约在100人,如果某天考勤人数小于50人,考勤机可能存在异常)
- 动态设备考勤机异常人数,监控考勤设备考勤数量是否正常(如果公司大批量招人,考勤人数异常为小于100人时)
/**
* 监控考勤设备的抽象方法
*/
public abstract class MonitorEquipment {
protected abstract String monitor();
}
/**
* 最基本的方法:监控设备是否正常运行,继承MonitorEquipment,并重写监控方法
*/
public class BaseMonitor extends MonitorEquipment {
@Override
protected String monitor() {
return " 监控考勤设备是否正常工作(基本)";
}
}
/**
* 装饰器角色:构造参数传入MonitorEquipment
*/
public class Decorator extends MonitorEquipment {
private MonitorEquipment monitorEquipment;
public Decorator(MonitorEquipment monitorEquipment) {
this.monitorEquipment = monitorEquipment;
}
@Override
protected String monitor() {
return monitorEquipment.monitor();
}
}
/**
* 具体装饰角色A:在原有功能基础上添加监控考勤人数是否正常
*/
public class MonitorA extends Decorator {
public MonitorA(MonitorEquipment monitorEquipment) {
super(monitorEquipment);
}
protected String monitor() {
return super.monitor() + "-----监控考勤人数是否正常";
}
}
/**
* 装饰角色B:添加设置最小监控异常人数为100人
*/
public class MonitorB extends Decorator {
public MonitorB(MonitorEquipment monitorEquipment) {
super(monitorEquipment);
}
protected String monitor() {
return super.monitor() + "----------设置最小监控异常人数为100人";
}
}
/**
* 测试类
*/
public class ClientTest {
public static void main(String[] args) {
MonitorEquipment monitorEquipment;
System.out.println("---------监控设备是否正常工作-----------");
monitorEquipment = new BaseMonitor();
System.out.println(monitorEquipment.monitor());
System.out.println("---------添加监控考勤人数是否异常-----------");
monitorEquipment = new MonitorA(monitorEquipment);
System.out.println(monitorEquipment.monitor());
System.out.println("---------设置最小监控异常人数-----------");
monitorEquipment = new MonitorB(monitorEquipment);
System.out.println(monitorEquipment.monitor());
}
}
测试结果
---------监控设备是否正常工作-----------
监控考勤设备是否正常工作(基本)
---------添加监控考勤人数是否异常-----------
监控考勤设备是否正常工作(基本)-----监控考勤人数是否正常
---------设置最小监控异常人数-----------
监控考勤设备是否正常工作(基本)-----监控考勤人数是否正常----------设置最小监控异常人数为100人