装饰器模式(装饰设计模式)笔记

在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。所有这些都可以釆用装饰器模式来实现。

装饰器模式的定义与特点

装饰器(Decorator)模式的定义:

在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。

装饰器模式优点:

装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果
装饰器模式完全遵守开闭原则

其主要缺点是:装饰器模式会增加许多子类,过度使用会增加程序得复杂性。

装饰器模式的结构与实现

通常情况下,扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。如果使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰器模式的目标。下面来分析其基本结构和实现方法。

模式的结构

抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

模式的实现

package decorator;
public class DecoratorPattern {public static void main(String[] args) {Component p = new ConcreteComponent();p.operation();System.out.println("---------------------------------");Component d = new ConcreteDecorator(p);d.operation();}
}
//抽象构件角色
interface Component {public void operation();
}
//具体构件角色
class ConcreteComponent implements Component {public ConcreteComponent() {System.out.println("创建具体构件角色");}public void operation() {System.out.println("调用具体构件角色的方法operation()");}
}
//抽象装饰角色
class Decorator implements Component {private Component component;public Decorator(Component component) {this.component = component;}public void operation() {component.operation();}
}
//具体装饰角色
class ConcreteDecorator extends Decorator {public ConcreteDecorator(Component component) {super(component);}public void operation() {super.operation();addedFunction();}public void addedFunction() {System.out.println("为具体构件角色增加额外的功能addedFunction()");}
}

程序运行结果如下:

创建具体构件角色
调用具体构件角色的方法operation()
---------------------------------
调用具体构件角色的方法operation()
为具体构件角色增加额外的功能addedFunction()

实例

用装饰器模式实现游戏角色“莫莉卡·安斯兰”的变身

public interface Morrigan {//抽象构件角色:莫妮卡
void dispaly();
}public class original implements Morrigan {//具体构件:原身@Overridepublic void dispaly() {// TODO Auto-generated method stubSystem.out.println("原生形态");}
}public class Change implements Morrigan {//形态转换
Morrigan m;
public Change(Morrigan m) {this.m=m;
}@Overridepublic void dispaly() {// TODO Auto-generated method stubm.dispaly();}}public class Succubus extends Change {//至尊魔女形态public Succubus(Morrigan m) {super(m);// TODO Auto-generated constructor stub}public void dispaly() {super.dispaly();name();}
public void name() {System.out.println("莫妮卡【至尊魔女】");}
}
public class Gray extends Change{//暗黑之潮public Gray(Morrigan m) {super(m);// TODO Auto-generated constructor stub}public void dispaly() {super.dispaly();name();}public void name() {System.out.println("莫妮卡【暗黑之潮】");}
}
//测试类
public class TestGirl {public static void main(String[] args) {// TODO Auto-generated method stubMorrigan m1= new original();Morrigan m2=new Succubus(m1);Morrigan m3=new Gray(m1);m2.dispaly();m3.dispaly();}}

输出结果

原生形态
莫妮卡【至尊魔女】
原生形态
莫妮卡【暗黑之潮】

2021-08-13# 装饰器模式(装饰设计模式)笔记相关推荐

  1. python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  2. java 装饰器模式_Java设计模式(9)----------装饰器模式

    1.介绍 装饰器模式是一种结构型的设计模式.使用该模式的目的是为了较为灵活的对类进行扩展,而且不影响原来类的结构.有同学说可以通过继承的方式进行实现啊,没错,继承的确可以实现,但是继承的成本相对比较高 ...

  3. 装饰者模式 php,PHP设计模式之装饰器模式

    装饰器设计模式 什么是装饰器模式 装饰器模式就是对一个已有的结构增加装饰.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象 ...

  4. Java设计模式之结构型:装饰器模式

    一.什么是装饰器模式: 当需要对类的功能进行拓展时,一般可以使用继承,但如果需要拓展的功能种类很繁多,那势必会生成很多子类,增加系统的复杂性,并且使用继承实现功能拓展时,我们必须能够预见这些拓展功能, ...

  5. Java设计模式12:装饰器模式

    装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...

  6. java中装饰器_Java设计模式12:装饰器模式

    装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...

  7. 设计模式--装饰器模式

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

  8. java设计模式之 装饰器模式

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

  9. 设计模式-装饰器模式 C++

    一.简介 1.什么是装饰器模式 装饰器模式是结构型设计模式. 装饰器是现有类的一个包装,可以在不修改现有类且不增加子类的情况下扩展现有类. [注]可以实现向一个现有对象添加新的功能,同时又不改变其结构 ...

  10. 【设计模式】【结构型模式】装饰器模式

    概念 定义 装饰模式指动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包 ...

最新文章

  1. LeetCode简单题之最常见的单词
  2. redis主从复制、高可用和集群
  3. Oracle undo表空间
  4. (转载)配置apue.h
  5. Microsoft SQL Server学习(二)--数据库的语法
  6. c语言或者cpp中位运算的技巧
  7. 揭开并发包底层AQS的神秘面纱
  8. 北斗导航 | 获取观测卫星的位置信息,并绘制卫星的方位角和仰角得到星空图:GSV语句(附Matlab源代码)
  9. 每日一测5(关于继承)
  10. linux下抓包学习--tcpdump的使用
  11. [php] 表单注意事项
  12. Java 常见面试题
  13. 郑州大学“战疫杯”大学生程序设计在线邀请赛(6)(C++题解+详细思路)2022年5月14日
  14. Android UI自动化工具-SoloPi
  15. MQTT:QoS服务质量 0,1,2(Quality of Service 0, 1 2)
  16. wlop一张多少钱_小白有个问题,为什么很多人都说 WLOP 的画不够好?
  17. SIPM模拟器 MIPS汇编语言实现读取文件
  18. it-tidalwave-semantic-aux-1.0.5.jar下载
  19. [UNR#5]诡异操作
  20. centos7搭建集群过程

热门文章

  1. npoi ppt html,NPOI(示例代码)
  2. 网站设置隐藏友情链接的方法!
  3. C# 三十二、Hashtable(哈希表)
  4. 知识小罐头06(tomcat8请求源码分析 中)
  5. abap中的BAPI_ASSET_RETIREMENT_POST (固定资产报废BAPI)
  6. PHP 实现全站静态化 首页静态化 列表页静态化 内容静态化 .
  7. 唉……今天还是出门了……还是陪别人出门……
  8. 二维数组排序算法php,phpsort_php二维数组排序方法
  9. 如何用最小代价,迅速提高你项目中“shit,android设计模式有几种
  10. 电脑计算机丢失很多东西怎么办,电脑缺少dll文件怎么办