一、概述

动态地给一个对象添加一些额外的职责。装饰模式比生成子类更为灵活。

二、适用性

1.在不影响其他对象的情况下,以动态、透明的方式给但个对象添加职责。

2.处理那些可以撤销的职责。

3.当不能采用生成子类的方式进行扩展的时候。

三、参与者

1.Component:定义一个对象接口,可以给这些对象动态地添加职责。

2.ConcreteComponent:定义一个对象,可以给这个对象添加一些职责。

3.Decorator:维持一个指向Component对象的指针,并且定义一个与Component接口一致的接口。

4.ConcreteDecorator:向组件添加职责。

四、类图

五、示例

Component

  1. package cn.lynn.decorator;
  2. public interface IAnimal {
  3. public void eat();
  4. }

ConcreteComponent

  1. package cn.lynn.decorator;
  2. public class Dog implements IAnimal {
  3. @Override
  4. public void eat() {
  5. System.out.println("狗啃骨头!");
  6. }
  7. }

Decorator

  1. package cn.lynn.decorator;
  2. public abstract class Decorator implements IAnimal {
  3. private IAnimal animal;
  4. public void setAnimal(IAnimal animal) {
  5. this.animal = animal;
  6. }
  7. @Override
  8. public void eat() {
  9. animal.eat();
  10. }
  11. }

ConcreteDecorator

  1. package cn.lynn.decorator;
  2. public class DogDecoratorA extends Decorator {
  3. @Override
  4. public void eat() {
  5. super.eat();
  6. transform();
  7. }
  8. public void transform() {
  9. System.out.println("机器狗变形出发!");
  10. }
  11. }
  1. package cn.lynn.decorator;
  2. public class DogDecoratorB extends Decorator {
  3. @Override
  4. public void eat() {
  5. super.eat();
  6. say();
  7. }
  8. public void say() {
  9. System.out.println("旺旺!");
  10. }
  11. }

Client

  1. package cn.lynn.decorator;
  2. public class Client {
  3. public static void main(String[] args) {
  4. Dog dog = new Dog();
  5. DogDecoratorA dogDecoratorA = new DogDecoratorA();
  6. DogDecoratorB dogDecoratorB = new DogDecoratorB();
  7. dogDecoratorA.setAnimal(dog);
  8. dogDecoratorB.setAnimal(dogDecoratorA);
  9. dogDecoratorB.eat();
  10. }
  11. }

Result

  1. 狗啃骨头!
  2. 机器狗变形出发!
  3. 旺旺!

GoF23种设计模式之结构型模式之装饰模式的更多相关文章

  1. GoF23种设计模式之结构型模式之桥接模式

    一.概述         将类的抽象部分与实现分部分离开来,使它们都可以独立地变化. 二.适用性 1.你不希望在抽象和实现之间有一个固定的绑定关系的时候.例如:在程序运行时实现部分应可以被选择或切换. ...

  2. GoF23种设计模式之结构型模式之组合模式

    一.概述 将对象组合成树型结构以表示“部分--整体”的层次关系.组合模式使得用户对单个对象和组合对象的使用具有一致性. 二.适用性 1.你想表示对象的部分--整体层次结构的时候. 2.你希望用户忽略组 ...

  3. GoF23种设计模式之结构型模式之外观模式

    一.概述         为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 二.适用性 1.当你要为一个复杂子系统提供一个简单接口的时候.子系统 ...

  4. GoF23种设计模式之结构型模式之代理模式

    一.概述 为其他对象提供一种代理以控制对这个对象的访问. 二.适用性 1.远程代理(RemoteProxy):为一个对象在不同的地址空间土工局部代表. 2.虚代理(VirtualProxy):根据需要 ...

  5. GoF23种设计模式之结构型模式之享元模式

    一.概述  运用共享技术有效地支持大量细粒度的对象. 二.适用性 1.当一个应用程序使用了大量的对象的时候. 2.由于使用大量的独享而造成很大的存储开销的时候. 3.对象的大多数状态都可变为外部状态的 ...

  6. GoF23种设计模式之结构型模式之适配器模式

    一.概述         将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 二.适用性 1.你想使用一个已经存在的类,但是它的接口不符合 ...

  7. Go语言实现的23种设计模式之结构型模式

    摘要:本文主要聚焦在结构型模式(Structural Pattern)上,其主要思想是将多个对象组装成较大的结构,并同时保持结构的灵活和高效,从程序的结构上解决模块之间的耦合问题. 本文分享自华为云社 ...

  8. Java经典23种设计模式之结构型模式(一)

    结构型模式包含7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式事实上非常easy.就像手 ...

  9. GoF的23种设计模式之结构型模式的特点和分类

    结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦合度低,满足 ...

随机推荐

  1. SpringBoot---核心---基本配置

    1.[入口类和@SpringBootApplication注解] 2.[关闭特定的配置] 3.[定制Banner] 1.1 修改Banner 1.2 关闭Banner 4.SpringBoot配置文件

  2. zk实现服务选举

    非公平选举算法1)首先通过zk创建一个 /server 的PERSISTENT节点 2)多台机器同时创建 /server/leader EPHEMERAL子节点 3)子节点只能创建一个,后创建的会失败 ...

  3. Android给图片加文字和图片水印

    我们在做项目的时候有时候需要给图片添加水印,水寒今天就遇到了这样的问题,所以搞了一个工具类,贴出来大家直接调用就行. /** * 图片工具类 * @author 水寒 * 欢迎访问水寒的个人博客:ht ...

  4. ArcGIS for Server内置JS Viewer的离线部署和配置

    很多情况下,在地图服务发布完毕后,我们往往利用 ArcGIS for Server内置的 JS Viewer来查看和检测所发布的地图服务是否满足我们的要求.具体操作如下: 点击开始 -> 所有程 ...

  5. SQL Server数据库log shipping 灾备(Part1 )

    1.概述 Log Shipping为SQL Server提供的数据库备份过程.它可以将数据库整个复制到另一台服务器上.在这种情况下,交易日志也会定期发送到备份服务器上供恢复数据使用,这使得服务器一直处 ...

  6. web端 第一天认识基础

    .NET 分为两大类 一.客户端应用程序   C/S 技术: Winform WPF MFC   MVVM 二.外部端应用程序  B/S(网页端应用程序/WEB端/WEB端应用程序) 目前学的技术是A ...

  7. 在windows 上编译部署Rap2

    在windows 上编译部署Rap2 引言 安装需要的环境 安装后端站点 创建数据库 在全局安装pm2 和 typescript 配置mysql,redis 数据库链接配置 初始化 编译 初始化数据库 ...

  8. 删除Chrome地址栏记录中自动补全的网址

    为了删除某个自动补全的网站,多年的历史纪录没了,还浪费我十多分钟,蠢哭_(:з」∠)_ 不是历史记录.不是清除浏览器数据.不是myactivity(谷歌账号)中的历史纪录,直接在书签中搜索,删除,OK ...

  9. CPP-STL:vector的内存释放

    1. vector容器的内存自增长 与其他容器不同,其内存空间只会增长,不会减小.先来看看"C++ Primer"中怎么说:为了支持快速的随机访问,vector容器的元素以连续方式 ...

  10. SC || Chapter 5 复习向

    可复用性 ┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉∞ ∞┉┉ 行为子结构 对于父子的继承关系的要求: ·子类可以增加方法,但不可以删 ·子类需实现抽象类型中未实现的方法 ·子类重写(override)的方法必须 ...