装饰模式即包装模式,是一种结构设计模式。从字面上理解就是包装一个对象。比如人要穿衣服,房子要装修。对于客户端来说,它是一个显示的包装,就是我知道你包装了什么。比如房子要装修。那么我们的房子可以抽象为一个接口,里面有一个装修的功能。它的某一个实现类属于空白。什么都不做。跟这个空白类平级需要一个装修抽象类,装修抽象类下有一些装修要素,比如装修墙,装修沙发,装修桌子。而我们只需要在这些装修抽象类中维护一个房子多态形式。代码如下

/*** 房子接口,用有装修的功能*/
public interface House {public void decorator();
}
/*** 空白房子,什么都不做*/
public class BlankHouse implements House{@Overridepublic void decorator() {System.out.println("我是一个空白房子");}
}

实际上这里也可以不用抽象类,直接用实现类也可以,但是这样就要在每个实现类维护House,所以这里用一个抽象类。

/*** 装饰器抽象类*/
public abstract class AbstractDecorator implements House{private House house;public AbstractDecorator(House house){this.house=house;}@Overridepublic void decorator() {this.house.decorator();}
}
/*** 沙发装饰器*/
public class SofaDecorator extends AbstractDecorator {public SofaDecorator(House house) {super(house);}/*** 核心在于装修的时候,先保留之前的装修方案*/@Overridepublic void decorator() {super.decorator();this.sofaDecorator();}private void sofaDecorator() {System.out.println("装修了大沙发");}
}
public class WallDecorator implements House {private House house;public WallDecorator(House house) {this.house=house;}@Overridepublic void decorator() {house.decorator();this.wallDecorate();}private void wallDecorate() {System.out.println("装修上了大墙");}
}
public class MainTest {public static void main(String[] args) {House house = new BlankHouse();house.decorator();//大白房System.out.println("................");house = new SofaDecorator(house);house.decorator();//装修大沙发System.out.println("................");house = new WallDecorator(house);house.decorator();//装修大墙System.out.println("=====================");//上面的方式需要一次,一次装修,下面的方式则是一次性装修完House house1 = new WallDecorator(new SofaDecorator(new BlankHouse()));house1.decorator();}
}
我是一个空白房子
................
我是一个空白房子
装修了大沙发
................
我是一个空白房子
装修了大沙发
装修上了大墙
》》》》》》》》》》》
我是一个空白房子
装修了大沙发
装修上了大墙

装饰器的目的就是可以层层包装,包装完成之后还是属于自身的那个对象。人穿上衣服还是那个人,房子装修之后还是那个房子。只是显示的添加了更多的东西在上面,具有组合的效果。可以选择性的装饰一些效果,比纯粹的继承要更加的灵活。但是因为嵌套层数太多,可能会导致问题排查不容易。

使用场景
1.需要去扩展一个类的功能的时候。
2.动态的进行类功能的加装和减装的时候。

7.设计模式-装饰模式相关推荐

  1. 设计模式----装饰模式

    设计模式--装饰模式 "装饰模式(Decorator)"又名"包装模式(Wrapper)",通常用来灵活地扩充对象的功能. 在此之前我们可以通过类的继承来扩充父 ...

  2. 大话设计模式-装饰模式(大鸟和小菜Java版)

    装饰模式:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.(百度百科) 这个模式让后期的修改变得极为简单,真的就高内 ...

  3. 大话设计模式—装饰模式

    装饰模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原 ...

  4. 设计模式--装饰模式

    目录 什么是装饰模式? 应用代码示例 装饰模式模板 jdk中的装饰模式 为什么装饰器类不能直接实现Component父类? 什么是装饰模式? 以生活中的场景来举例,一个蛋糕胚,给它涂上奶油就变成了奶油 ...

  5. C++设计模式-装饰模式

    目录 基本概念 代码和实例 基本概念 装饰模式是为已有功能动态地添加更多功能的一种方式. 当系统需要新功能的时候,是向旧系统的类中添加新代码.这些新代码通常装饰了原有类的核心职责或主要行为. 装饰模式 ...

  6. 李建忠设计模式——装饰模式

    1."单一职责"模式 在软件组件的设计中,如果责任划分不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任. 典型模式 Deco ...

  7. C++设计模式——装饰模式(高屋建瓴)

    原网址:https://blog.csdn.net/CoderAldrich/article/details/83115394 重点在于 ConcreteDecoratorA(Component *d ...

  8. java设计模式——装饰模式

    装饰模式也称为包装模式.结构型设计模式之一,其使用一种对客户端透明的方式动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一. 装饰模式可以动态的给一个对象添加一些额外的职责.就增加功能功能来说 ...

  9. 设计模式——装饰模式详解

    0. 前言   写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇 ...

  10. 设计模式 | 装饰模式

    1 | 装饰模式的概述 我们在了解装饰模式之前,先回顾下生活中的几个常见现象,举例如下: 新房的装修,房屋装修并没有改变房屋居住的本质,但可以让房屋变得更漂亮,更温馨,更实用,更满足居家需求. 相片的 ...

最新文章

  1. 某程序员女友爆料:男朋友和公司的UI搞到了一起!女UI段位太高!半夜公然打电话挑衅!
  2. 自由自在公司休闲食品让生活进入“休闲时代“
  3. java要频繁调用容器时_JAVA基础面试题
  4. SpringAop对struts2的Action设置切面织入时报错java.lang.NoSuchMethodException
  5. 通过yum安装Nginx
  6. app式成语_疯狂的成语app
  7. 腾讯视频如何设置画面对比度方面的内容
  8. 力扣206-反转链表(Java,迭代)
  9. Java虚拟机-垃圾回收器
  10. Keras中RNN、LSTM、GRU等输入形状batch_input_shape=(batch_size,time_steps,input_dim)及TimeseriesGenerator详解
  11. Tomcat重启命令
  12. 知乎:前端IDE 那个流行,那个好;
  13. 即席查询(Ad Hoc)入门(Kylin)
  14. 小区水电费管理系统-水电费收费管理系统-社区物业水电缴费管理系统代码
  15. 第八问:hub 集线器是啥,作用
  16. 计算机里的声卡的主要作用,声卡是什么?他的主要作用有哪些?
  17. Python 列表推导式的实用小技巧
  18. css文字高光,CSS实现文字高光水波渐变的动态效果实例
  19. Hive SQL复杂场景实现(1) —— 连续发单天数
  20. Jetson TX2 重装系统(刷机)+后续设置(安装Fcitx、解决拼音候选词不显示、换国内源、局域网实现VNC远程桌面)

热门文章

  1. 郭德纲写给儿子郭麒麟的信
  2. 站长工具之在线检测网页错误
  3. shell脚本内调用另外一个shell脚本的几种方法
  4. 后台学习六---ajaxFileupload文件上传下载
  5. 在线部分:werobot服务、主要逻辑服务、句子相关模型服务、BERT中文预训练模型+微调模型(目的:比较两句话text1和text2之间是否有关联)、模型在Flask部署
  6. JAVA基于CompletableFuture的流水线并行处理深度实践
  7. 12. 查询每一门课的间接先修课(即先修课的先修课)
  8. MySQL之DML操作基础--单表查询
  9. 图文样式css样式,初学解惑:常用CSS样式图文设置教程
  10. 创意PS:用影子讲故事