装饰者模式:动态地将责任附加到对象上,若要扩展对象,装饰者模式提供了比继承更弹性的替代方案
要点:装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为
装饰者包含一个超类的对象,这样,可以在被装饰者行为前或者行为后加上新的行为,甚至取代原有的行为
装饰者会使程序中出现很多小类,增加使用难度
使用场景:对象由主体+许多可选的部件或者功能构成,使用继承或者接口会产生很多类,且很难扩展。例如,现在需要一个汉堡,主体是鸡腿堡,可以选择添加生菜、酱、辣椒等等许多其他的配料,这种情况下就可以使用装饰者模式。
实例:
-
汉堡基类
- package decorator;
- public abstract class Humburger {
- protected String name ;
- public String getName(){
- return name;
- }
- public abstract double getPrice();
- }
- 鸡腿堡类
- package decorator;
- public class ChickenBurger extends Humburger {
- public ChickenBurger(){
- name = "鸡腿堡";
- }
- @Override
- public double getPrice() {
- return 10;
- }
- }
- 配料的基类
- package decorator;
- public abstract class Condiment extends Humburger {
- public abstract String getName();
- }
- 生菜
- package decorator;
- public class Lettuce extends Condiment {
- Humburger humburger;
- public Lettuce(Humburger humburger){
- this.humburger = humburger;
- }
- @Override
- public String getName() {
- return humburger.getName()+" 加生菜";
- }
- @Override
- public double getPrice() {
- return humburger.getPrice()+1.5;
- }
- }
- 辣椒
- package decorator;
- public class Chilli extends Condiment {
- Humburger humburger;
- public Chilli(Humburger humburger){
- this.humburger = humburger;
- }
- @Override
- public String getName() {
- return humburger.getName()+" 加辣椒";
- }
- @Override
- public double getPrice() {
- return humburger.getPrice(); //辣椒是免费的哦
- }
- }
- 测试
- package decorator;
- public class Test {
- /**
- * @param args
- */
- public static void main(String[] args) {
- Humburger humburger = new ChickenBurger();
- System.out.println(humburger.getName()+" 价钱:"+humburger.getPrice());
- Lettuce lettuce = new Lettuce(humburger);
- System.out.println(lettuce.getName()+" 价钱:"+lettuce.getPrice());
- Chilli chilli = new Chilli(humburger);
- System.out.println(chilli.getName()+" 价钱:"+chilli.getPrice());
- Chilli chilli2 = new Chilli(lettuce);
- System.out.println(chilli2.getName()+" 价钱:"+chilli2.getPrice());
- }
- }
- 输出
- 鸡腿堡 价钱:10.0
- 鸡腿堡 加生菜 价钱:11.5
- 鸡腿堡 加辣椒 价钱:10.0
- 鸡腿堡 加生菜 加辣椒 价钱:11.5
java.io便是使用了装饰者模式
相关推荐
“就增加功能来说,Decorator 模式相比生成子类更为灵活” 这句话的含义是,组合比继承更灵活,当可拓展的功能很多时,继承方案会产生大量的子类,而组合可以提
装饰者模式(Decorator Pattern)是一种结构型设计模式,它的定义是在不改变原有对象结构的基础上,动态地给该对象增加一些职责(即增加其额外功能)。这种模式允许向一个现有的对象添加新的功能,同时又不改变其...
Head First 设计模式 (三) 装饰者模式(decorator pattern) C++实现 VS2012 下通过
滥用装饰器模式 安装 如果您有风险,请继续使用此功能。 你是大人 npm install --save react-global-event-decorator 这个是来做什么的? 当您单击DOM中的任意位置时,曾经有一个React组件需要执行操作吗? 它...
NULL 博文链接:https://janeky.iteye.com/blog/472502
NULL 博文链接:https://chuanwang66.iteye.com/blog/1325151
Laravel应用中的装饰器模式 用 :red_heart: 用于智能清洁编码器 尝试将“装饰器”功能从python语言移植到laravel框架。 :delivery_truck: 安装 : composer require imanghafoori/laravel-decorator 什么是...
c++设计模式-结构型模式-装饰器模式;QT工程;...装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
设计模式C++学习之装饰模式(Decorator)
NULL 博文链接:https://jacky-dai.iteye.com/blog/1132229
动态地给一个对象添加一些额外的职责。就扩展功能而言,它比生成子类方式更为灵活。
C#设计模式之Decorator 装饰模式,pdf+视频教学,实例演示,易学易用~~
NULL 博文链接:https://xiangtui.iteye.com/blog/1033790
5、装饰模式(Decorator) 用意:动态地给一个对象增加其它职责,比继承实现灵活。
设计模式 - 装饰模式(C++实例) 若有问题,请指出。
学习java 装饰模式(decorator)非常好的例子
Head First学习笔记+Head First之装饰者模式高清PDF