设计模式之装饰器模式
Decorator(装饰器模式)
一、装饰器模式简介
装饰器模式(Decorator)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
核心:
- 1、动态地给一个对象添加一些额外的职责
- 2、防止使用继承扩展造成的子类膨胀
- 3、将具体功能职责划分,同时继承装饰者模式
二、组合模式优缺点比较
优点:
- 1、装饰类和被装饰类可以独立发展,不会相互耦合
- 2、扩展灵活,不会导致类个数急剧增加
- 3、可以多次装饰构件不同功能的对象,使之功能强大
缺点:
- 1、多层装饰比较复杂
- 2、产生很多小对象,占用内存,一定程度上影响性能
使用场景:
- 1、IO中输入流和输出流的设计
- 2、Swing包中图形界面构件功能
- 3、HttpServletRequestWrapper,HttpServletRequestWrapper 类,增强了request对象的功能
注意事项:代替继承
三、UML类图实现
四、实现
步骤1:创建抽象构件接口
//Component抽象构件角色 public interface ICar { public void run(); }
步骤2:创建实现抽象接口的真实对象
//ConcreteComponent 具体构件角色(真实对象) public class AudiCar implements ICar{ @Override public void run() { System.out.println("奥迪在陆地上运行"); } }
步骤3:创建实现抽象接口的装饰器
//Decorator装饰角色 public class CarDecorator implements ICar { protected ICar car; public CarDecorator(ICar car) { this.car = car; } @Override public void run() { car.run(); } }
步骤4:创建具体装饰对象
//ConcreteDecorator具体装饰角色 public class AICarDecorator extends CarDecorator { public AICarDecorator(ICar car) { super(car); } public void run() { car.run(); move(); } public void move() { System.out.println("车可以自动驾驶运行!"); } } public class FlyCarDecorator extends CarDecorator { public FlyCarDecorator(ICar car) { super(car); } public void run() { car.run(); fly(); } public void fly() { System.out.println("车可以飞"); } }
步骤5:调用者测试
public class DecoratorDemo01 { public static void main(String[] args) { ICar car = new AudiCar(); car.run(); System.out.println("增加性能,车可以飞"); ICar fly = new FlyCarDecorator(car); fly.run(); System.out.println("增加性能,车可以自动行驶"); ICar aiCar = new AICarDecorator(car); aiCar.run(); System.out.println("增加性能,飞和自动行驶"); ICar topCar = new AICarDecorator(fly); topCar.run(); } }
步骤6:运行程序,观察结果
posted on 2020-04-04 22:37 VincentYew 阅读(245) 评论(0) 收藏 举报