前言
本篇文章介绍了结构型模式——Decorator Pattern
有关设计模式内容可以翻翻我之前的文章浅谈设计模式及Singleton
装饰(Decorator)模式
装饰模式主要用于在运行时修改或拓展实例的行为。
一般来说,继承可以拓展类的功能,但代码使用继承有很大缺点。
通过装饰模式,我们可以选择一个类的某个对象,并对其进行修改,而不会影响这个类的其他实例。
UML图
- 抽象构件(Component):用于能动态添加功能的对象
- 具体组件(ConcreteComponent):定义一个需要装饰的原始类
- 装饰角色(Decorator):持有构件对象的实例,,并定义一个与抽象构件接口一致的接口
- 具体装饰角色(ConcreteDecorator):负责对构件对象进行装饰
代码示例
场景示例:
以改装比亚迪汽车为例,
- 抽象构件(Component)
public interface ICar {
public void showComponent();
}
- 具体组件(ConcreteComponent)
public class BYD implements ICar{
//裸车
@Override
public void showComponent() {
System.out.println("比亚迪拖拉机");
}
}
- 抽象装饰角色(Decorator)
public abstract class CarDecorator implements ICar{
private ICar car = null;
public CarDecorator(ICar car){
this.car = car;
}
public void showComponent(){
this.car.showComponent();
}
}
- 具体装饰角色(ConcreteDecorator)
public class ConcreteDecorator extends CarDecorator{
public ConcreteDecorator(ICar car) {
super(car);
}
@Override
public void showComponent() {
super.showComponent();
addGps();
addGrapher();
}
public void addGps(){
System.out.println("加装GPS");
}
public void addGrapher(){
System.out.println("加装行车记录仪");
}
}
- 测试类
public class Demo {
public static void main(String[] args) {
ICar car = new BYD();
CarDecorator decorator = new ConcreteDecorator(car);
decorator.showComponent();
}
}
- 结果
这样我们就完成了用装饰类来修饰基础组件
当我们想要再进行修饰的话,才会体现出装饰模式的优点
- 新建装饰类
public class ConcreteDecorator1 extends ConcreteDecorator{
public ConcreteDecorator1(CarDecorator cd) {
super(cd);
}
public void addWheel(){
System.out.println("加装备胎");
}
@Override
public void showComponent() {
super.showComponent();
addWheel();
}
}
- 再次测试
public class Demo {
public static void main(String[] args) {
ICar car = new BYD();
CarDecorator decorator = new ConcreteDecorator(car);
CarDecorator decorator1 = new ConcreteDecorator1(decorator);
decorator1.showComponent();
}
}
- 结果
结合UML图分析哦。