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

/*** 房子接口,用有装修的功能*/
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. LeetCode刷题记录6——696. Count Binary Substrings(easy)
  2. 集锦分享 | 200篇原创笔记,帮助你快速入门Python与机器学习
  3. 科技部部长:基础研究是科技创新“总开关”
  4. 【alibaba-cloud】nacos详解
  5. 关于Configuration.ConfigurationManager
  6. Git——git push 错误[error: src refspec master does not match any]解决方案
  7. 千分之三用计算机怎么算,浓度换算计算器(浓度单位换算器在线使用)
  8. HTTP协议及其POST与GET操作差异 C#中如何使用POST、GET等
  9. SpringBoot四大核心之actuator——程序监控器
  10. UVA10733 The Colored Cubes【Polya定理】
  11. 【转】requests、BeautifulSoup使用总结
  12. 幻想影院添加html渲染,幻想影院无毒版-幻想影院清爽版预约 _5577安卓网
  13. mobile的一些link
  14. multisim的汉化
  15. 大白菜pe 通用pe 安装心得
  16. 重启计算机有什么用,强制重启电脑有什么危害
  17. 对接萤石平台调用播放
  18. 编写网易邮箱登陆界面
  19. 阿里云镜像恢复,镜像取证
  20. inspects a maven model for resolution problems

热门文章

  1. [日志]小沈阳搞笑经典语录
  2. DNS服务器设置正确,客户机在加入域时,需要正确设置首选DNS服务器地址,否则无法加入。 ( )...
  3. java 三目运算符解析
  4. Spring Boot 集成 Redis 缓存
  5. iOS截取字符串(NSString)
  6. 华为手机锁屏后显示无法连接服务器,锁屏状态可以远程连接服务器
  7. ITU-T G.781标准解读(二)
  8. word删除多余换行_批量删除Word中多余回车
  9. LINUX特殊符号详解
  10. IRQL_NOT_LESS_OR_EUQAL,间歇性蓝屏,4800h笔记本,暗影精灵6,解决办法,蓝屏问题排查