文章目录

  • Decorator模式
    • 应用场景
    • 本质
    • 优点
    • 缺点
    • 角色
    • Decorator模式的类图
    • 示例程序
      • 示例程序的类图
      • 示例代码
    • 拓展思路
    • 相关设计模式
    • 满足的原则

Decorator模式

应用场景

  • 当我们需要为某个现有的对象,动态的增加一个新的功能或职责时,可以考虑使用装饰模式。
  • 适应于某个对象的职责经常发生变化或者经常需要动态的增加职责,避免因为这种为了适应这样的变化,而增加继承子类扩展的方式

本质

  • 动态组合

优点

  • 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比 继承更多的灵活性。
  • 通过使用不同的其体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

缺点

  • 会产生很多细粒度对象

角色

  • 抽象构件(Component)角色:
    给出一个抽象接口,以规范准备接收附加责任的对象。
  • 具体构件(Concrete Component)角色:
    实现组件对象接口,通常就是被装饰器装饰的对象。
  • 装饰(Decorator)角色:
    持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
  • 具体装饰(Concrete Decorator)角色:
    负责给构件对象"贴上"附加的责任。

Decorator模式的类图

示例程序

示例程序的类图

示例代码

public abstract class Component {protected String name;protected double mon;public Component() {}public Component(String name, Double mon) {this.name = name;this.mon = mon;}public abstract double money();
}
public class Leader extends Component {public Leader() {super();}public Leader(String name, double mon) {super(name, mon);}@Overridepublic double money() {return mon;}}
public class Person extends Component {public Person() {super();}public Person(String name, double mon) {super(name, mon);}@Overridepublic double money() {return mon;}}
public class Money1 extends Component {private Component ob1;public Money1(String name, Double mon) {super(name, mon);}public Money1(Component ob1) {super();this.ob1 = ob1;this.mon=this.ob1.mon;this.name=this.ob1.name;}@Overridepublic double money() {this.ob1.mon=ob1.money();return this.ob1.mon;}}
public class Money2 extends Component {private Component ob2;public Money2(Component ob2) {super();this.ob2 = ob2;this.mon=this.ob2.mon;this.name=this.ob2.name;}@Overridepublic double money() {this.ob2.mon=2*ob2.money();return this.ob2.mon;}}
public class Main {public static void main(String[] args) {Money1 money1=new Money1(new Person("小张",5000));System.out.println(money1.money());Money2 money2=new Money2(new Money1(new Leader("小李",50000)));System.out.println(money2.money());}
}

拓展思路

  • 接口API的透明性
  • 动态地增加功能

相关设计模式

  • 适配器模式
    装饰模式可以在不改变被装饰物的接口的前提下,为被装饰物添加边框。
    适配器模式用于适配两个不同的接口。
  • 策略模式。
    策略模式,通过整体的替换算法来改变类的功能
    装饰模式通过增加边框来改变类的功能。

满足的原则

  • 开放封闭原则
  • 合成聚合原则

装饰边框 与 被装饰物 一致的 Decorator模式相关推荐

  1. Decorator模式------装饰边框与被装饰物的一致性

    1. >>不断地为对象装饰的设计模式称为Decorator 模式. 2. 示例程序 >>功能:给文字添加装饰边框.这里所谓的装饰边框是指用" - " &qu ...

  2. 【笔记整理】图解设计模式 | 第12章 Decorator模式(装饰边框与被装饰物的一致性)

    [笔记整理]图解设计模式 | 导航 定义 不断地为对象添加装饰的设计模式被称为Decorator模式,其中Decorator指的是"装饰物". Decorator模式中的登场角色 ...

  3. 设计模式(十二)-装饰器模式(Decorator Pattern)——装饰边框与被饰物的一致性

    装饰器模式(Decorator Pattern)能不断的为对象添加装饰. Display.java package com.test.dp.Decorator.Sample;//抽象类,用于显示字符串 ...

  4. 设计模式-Decorator模式(装饰者模式)

    文章目录 装饰者模式 代码实现 为什么使用装饰者模式 装饰者模式 假如现在有一块蛋糕, 加上奶油就是奶油蛋糕.如果继续再加上草莓,就是草莓蛋糕,再加点蜡烛,就变成了生日蛋糕.不论是蛋糕.奶油蛋糕.草莓 ...

  5. 11.设计模式--装饰者模式(Decorator模式)

    1.定义 装饰者模式是一种结构型模型,是动态的给对象增加职责,对于新增功能来说要比通过子类方式更加的灵活. 想想一下现在有一块蛋糕,他本质上就是一个蛋糕,而如果在蛋糕上加上巧克力就变成了巧克力蛋糕,而 ...

  6. 设计模式学习笔记——装饰(Decorator)模式

    设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...

  7. 设计模式--装饰者(Decorator)模式

    模式定义 动态(组合)地给一个对象增加一些额外的职责,就增加功能而言,Decorator模式比生成子类(继承)更为灵活(消除重复代码并且减少子类个数) 类图 应用场景 扩展一个类的功能或给一个类添加附 ...

  8. android 装饰着模式,Android与设计模式——装饰者(Decorator)模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述装饰(Decorator)模式的: 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替 ...

  9. android银色质感按钮,银色装饰边框承载接口与按键_手机Android频道-中关村在线...

    三星I699的机身侧面全部被极具金属质感的银色装饰边框包裹起来,整体看来非常抢眼.虽然银色的包边还算常见,但三星I669在这个边框上也还是下了一些功夫的.仔细看的话可以发现边框并不像机身那样采用了平滑 ...

最新文章

  1. 嵌入式系统一次EMMC测试的体会及错误分析过程
  2. 扩增子图表解读1箱线图:Alpha多样性,老板再也不操心的我文献阅读了
  3. java对象的强引用,软引用,弱引用和虚引用
  4. mysql的多master调度_innodb中master线程的调度的算法改进(mysql 5.6.26)
  5. 前端学习(2970):首页的简单尝试
  6. C#中跨窗体操作(1)--事件
  7. linux的基础知识——TCP通信状态
  8. pytorch实现基本AutoEncoder与案例
  9. RFC2616中文版(8)连接
  10. 如何运行自动 Mac 清理
  11. Redis持久化的方式
  12. 教你如何安装字体包 ——思源免费商用字体
  13. 应用COMSOL Multiphysics分析水平井压裂裂缝应力干扰现象
  14. 软件测试用例常用七大方法
  15. MIT线性代数笔记七 列空间和零空间求解 Ax=0:主变量和特解
  16. Java 设计模式 本文代码拉取链接 https://gitlab.com/zhangpengweiLJ/designpettern.git
  17. 游戏获取服务器信息,易语言获取游戏服务器信息
  18. Android指南针代码示例
  19. 57BYG250B步进电机+SR4驱动器
  20. linux修改证书通用名,linux – 证书通用名称`* .c.ssl.fastly.net’与请求的主机名不匹配...

热门文章

  1. 使用ECharts实现数据图表分析
  2. Google adwords的优化
  3. flutter dart list 遍历数据
  4. C#+Midi 模拟各种乐器演奏
  5. iOS 5.0.1 Redsn0w红雪越狱破解教程[图]
  6. 如何判断是否是retina屏幕和ipad
  7. day18(续)PC端品优购项目
  8. Linux Varnish
  9. 暴击java7723_热血足球之暴力闯关版
  10. cocos2d-iphone之魔塔20层第七部分