目录
🍟4.测试
1.了解装饰器模式
- 也叫包装设计模式,属于结构型模式
- 它是作为现有的类的一个包装,允许向一个现有的对象添加新的功能,同时又不改变其结构
- 给对象增加功能,一般两种方式继承或关联组合
- 将一个类的对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为来增强功能,这个就是装饰器模式
2.装饰器的各个组件
- 抽象组件(Component):定义装饰方法的规范
- 被装饰者(ConcreteComponent):Component的具体实现,就是要装饰的具体对象
- 装饰者组件(Decorator):定义具体装饰者的行为规范,和Component角色有相同的接口,持有组件(Component)对象的实例引用
- 具体装饰物(ConcreteDecorator): 负责给构件对象装饰附加的功能
3.案例实操
-
抽象组件
//抽象组件 public interface Bike { //描述 String getDesc(); //价格 int getPrice(); }
-
被装饰者
//具体的被装饰者1 public class BigBike implements Bike{ private String desc="大号自行车"; @Override public String getDesc() { return desc; } @Override public int getPrice() { return 200; } } //具体的被装饰者2 public class SmallBike implements Bike{ private String desc="小号自行车"; @Override public String getDesc() { return desc; } @Override public int getPrice() { return 100; } }
-
装饰器
//装饰器 public class BikeDecorator implements Bike{ private String desc="装饰器"; @Override public String getDesc() { return null; } @Override public int getPrice() { return 0; } }
- 具体的装饰器
//具体的装饰器1 public class RSCBikeDecorator extends BikeDecorator { private String desc = "增加一个防爆胎"; //以构造器的形式传入被装饰者 private Bike bike; public RSCBikeDecorator(Bike bike) { this.bike = bike; } @Override public String getDesc() { return bike.getDesc() + "," + desc; } @Override public int getPrice() { return bike.getPrice() + 100; } } //具体的装饰器2 public class SunNaBIkeDecorator extends BikeDecorator{ private String desc="增加一个喇叭"; //以构造器的形式传入被装饰者 private Bike bike; public SunNaBIkeDecorator(Bike bike) { this.bike = bike; } @Override public String getDesc() { return bike.getDesc()+","+desc; } @Override public int getPrice() { return bike.getPrice()+100; } }
4.测试
public class Main { public static void main(String[] args) { Bike bigBike = new BigBike(); bigBike = new RSCBikeDecorator(bigBike); bigBike = new SunNaBIkeDecorator(bigBike); bigBike = new SunNaBIkeDecorator(bigBike); System.out.println(bigBike.getDesc()+","+bigBike.getPrice()); } }
5.优缺点
- 优点:
- 装饰模式与继承关系的目的都是要扩展对象的功能,但装饰模式可以提供比继承更多的灵活性。
- 使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合,原有代码无须改变,
- 缺点:
- 装饰模式增加了许多子类,如果过度使用会使程序变得很复杂(多层包装)
- 增加系统的复杂度,加大学习与理解的难度