JAVA设计模式-装饰器(者)模式 作者:马育民 • 2021-06-11 11:03 • 阅读:10053 # 说明 装饰器模式(Decorator Pattern),向一个现有的对象添加新的功能,同时又不改变其结构。 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,提供了额外的功能 ### 优点 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以 **扩展一个类的功能**,即:**扩展其他方法** ### 缺点 多层装饰比较复杂。 # 应用场景 扩展类的功能 ### 真实例子 BufferedInputStream 缓冲流 关键代码: ``` //原有类 InputStream inputStream = new FileInputStream(filepath); //装饰类,传入原有类对象,通过装饰类,增加额外功能 BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); ``` `InputStream`类已经写好了,功能完善,已经正常使用。 但有些情况下,需要额外功能,,通过 `BufferedInputStream`装饰器类,增加额外功能 # 例子 [](https://www.malaoshi.top/upload/pic/java/Snipaste_2021-06-11_13-56-56.png) 轿车具备完整的功能,可以正常使用 但有些时候,需要加装 车顶行李箱,装衣服、裤子,在不需要时,还可以卸下 通过装饰器模式,设计这一功能 ### 轿车接口 ``` public interface ICar { public void drive(String dest); } ``` ### 轿车类 该类已经是一个完整的类,可以正常使用 ``` public class Car implements ICar{ @Override public void drive(String dest) { System.out.println("出发去 "+dest); } } ``` ### 抽象装饰器类 其作用是:装饰器类继承该类 ``` public abstract class CarDecorator implements ICar{ protected ICar car; public CarDecorator(ICar car) { this.car=car; } @Override public void drive(String dest) { car.drive(dest); } } ``` ### 装饰器类 增加 放行李、移除行李功能 ``` public class BootCar extends CarDecorator{ private List clothesList =new ArrayList(); public BootCar(ICar car) { super(car); } @Override public void drive(String dest) { if(!clothesList.isEmpty()){ System.out.print("带上 "); for(String item: clothesList){ System.out.print(item+" "); } } super.drive(dest); } /** * 放衣服 * @param clothes */ public void put(String clothes){ clothesList.add(clothes); } /** * 移除 * @param clothes */ public void remove(String clothes){ clothesList.remove(clothes); } } ``` ### 测试装饰器类 在不改变 原有轿车类 的情况下,增加 放行李、移除行李功能 ``` ICar car=new Car(); BootCar bCar=new BootCar(car); bCar.put("T恤"); bCar.put("沙滩裤"); bCar.put("沙滩鞋"); bCar.remove("T恤"); bCar.drive("海南岛"); ``` ### 测试原有轿车类 原有的轿车类没有改变,仍然可以使用 ``` ICar car=new Car(); car.drive("公司"); ``` 原文出处:http://malaoshi.top/show_1IX1I752MrKw.html