装饰模式有四个角色:
1.Component抽象构件
Component是一个接口或者是抽象类,就是定义咱们最核心的对象,也就是最原始的对
象。
2.ConcreteComponent 具体构件
ConcreteComponent是最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是
它。
3.Decorator装饰角色
通常是一个抽象类,作什么用呢?实现接口或者抽象方法,它里面可不必定有抽象的方
法呀,在它的属性里必然有一个private变量指向Component抽象构件。
4.具体装饰角色
ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰类,你要把你最核心的、最
原始的、最基本的东西装饰成其余东西。java
具体请看例子:
Caride
/** * @author shuliangzhao * @Title: Car * @ProjectName design-parent * @Description: TODO * @date 2019/6/13 23:26 */ public abstract class Car { public abstract void driver(); }
AudiCarflex
/** * @author shuliangzhao * @Title: AudiCar * @ProjectName design-parent * @Description: TODO * @date 2019/6/13 23:27 */ public class AudiCar extends Car { @Override public void driver() { System.out.println("速度为每小时50KM"); } }
DecoratorCarthis
/** * @author shuliangzhao * @Title: DecoratorCar * @ProjectName design-parent * @Description: TODO * @date 2019/6/13 23:28 */ public abstract class DecoratorCar extends Car{ private Car car; public DecoratorCar(Car car) { this.car = car; } @Override public void driver() { car.driver(); } }
BlueAudiCarspa
/** * @author shuliangzhao * @Title: BlueAudiCar * @ProjectName design-parent * @Description: TODO * @date 2019/6/13 23:31 */ public class BlueAudiCar extends DecoratorCar { public BlueAudiCar(Car car) { super(car); } @Override public void driver() { this.color(); super.driver(); } private void color() { System.out.println("蓝色奥迪车"); } }
/** * @author shuliangzhao * @Title: BmwCar * @ProjectName design-parent * @Description: TODO * @date 2019/6/13 23:30 */ public class RedAudiCar extends DecoratorCar { public RedAudiCar(Car car) { super(car); } @Override public void driver() { this.color(); super.driver(); } private void color() { System.out.println("红色奥迪车"); } }
客户端code
/** * @author shuliangzhao * @Title: Client * @ProjectName design-parent * @Description: TODO * @date 2019/6/13 23:32 */ public class Client { public static void main(String[] args) { Car car = new AudiCar(); car.driver(); Car redCar = new RedAudiCar(car) ; redCar.driver(); Car blueCar = new BlueAudiCar(car); blueCar.driver(); } }
运行结果orm
1.装饰类和被装饰类能够独立发展,而不会相互耦合。
2.装饰模式是继承关系的一个替代方案。
3.能够动态扩展类。对象
多层的装饰是比较复杂。继承
须要动态地给一个对象增长功能、须要扩展一个类的功能。接口
举个简单例子能够看出装饰模式的好处:三个继承关系Father、Son、GrandSon三个类,我要在Son类上加强一些功能怎么办?我想你会坚定地顶回去!不容许,对了,为何呢?你加强的功能是修改Son类中的方法吗?增长方法吗?对GrandSon的影响呢?特别是GrandSon有多个的状况,你会怎么办?这个评估的工做量就够你受的,因此这是不容许的,那仍是要解决问题的呀,怎么办?经过创建SonDecorator类来修饰Son,至关于建立了一个新的类,这个对原有程序没有变动,经过扩展很好地完成了此次变动。