设计模式-凯发k8官方网
attach additional responsibilities to an object dynamically keeping the same interface.decorators provide a flexible alternative to subclassing for extending functionality.(动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。)
装饰模式有四个角色:
1.component抽象构件
component是一个接口或者是抽象类,就是定义我们最核心的对象,也就是最原始的对
象。
2.concretecomponent 具体构件
concretecomponent是最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是
它。
3.decorator装饰角色
一般是一个抽象类,做什么用呢?实现接口或者抽象方法,它里面可不一定有抽象的方
法呀,在它的属性里必然有一个private变量指向component抽象构件。
4.具体装饰角色
concretedecoratora和concretedecoratorb是两个具体的装饰类,你要把你最核心的、最
原始的、最基本的东西装饰成其他东西。
具体请看例子:
car
audicar
/*** @author shuliangzhao* @title: audicar* @projectname design-parent* @description: todo* @date 2019/6/13 23:27*/ public class audicar extends car {@overridepublic void driver() {system.out.println("速度为每小时50km");} }decoratorcar
/*** @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;}@overridepublic void driver() {car.driver();} }blueaudicar
/*** @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);}@overridepublic 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);}@overridepublic void driver() {this.color();super.driver();}private void color() {system.out.println("红色奥迪车");} }客户端
/*** @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();} }运行结果
image.png
装饰模式优点:
1.装饰类和被装饰类可以独立发展,而不会相互耦合。
2.装饰模式是继承关系的一个替代方案。
3.可以动态扩展类。
装饰模式缺点:
多层的装饰是比较复杂。
装饰模式使用场景:
需要动态地给一个对象增加功能、需要扩展一个类的功能。
举个简单例子可以看出装饰模式的好处:三个继承关系father、son、grandson三个类,我要在son类上增强一些功能怎么办?我想你会坚决地顶回去!不允许,对了,为什么呢?你增强的功能是修改son类中的方法吗?增加方法吗?对grandson的影响呢?特别是grandson有多个的情况,你会怎么办?这个评估的工作量就够你受的,所以这是不允许的,那还是要解决问题的呀,怎么办?通过建立sondecorator类来修饰son,相当于创建了一个新的类,这个对原有程序没有变更,通过扩展很好地完成了这次变更。
注意:继承是静态地给类增加功能,而装饰模式则是动态地增加功能。
总结
以上是凯发k8官方网为你收集整理的的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇:
- 下一篇: