2021-08-13# 装饰器模式(装饰设计模式)笔记
装饰器模式(装饰设计模式)笔记
在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。所有这些都可以釆用装饰器模式来实现。
装饰器模式的定义与特点
装饰器(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# 装饰器模式(装饰设计模式)笔记相关推荐
- python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- java 装饰器模式_Java设计模式(9)----------装饰器模式
1.介绍 装饰器模式是一种结构型的设计模式.使用该模式的目的是为了较为灵活的对类进行扩展,而且不影响原来类的结构.有同学说可以通过继承的方式进行实现啊,没错,继承的确可以实现,但是继承的成本相对比较高 ...
- 装饰者模式 php,PHP设计模式之装饰器模式
装饰器设计模式 什么是装饰器模式 装饰器模式就是对一个已有的结构增加装饰.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象 ...
- Java设计模式之结构型:装饰器模式
一.什么是装饰器模式: 当需要对类的功能进行拓展时,一般可以使用继承,但如果需要拓展的功能种类很繁多,那势必会生成很多子类,增加系统的复杂性,并且使用继承实现功能拓展时,我们必须能够预见这些拓展功能, ...
- Java设计模式12:装饰器模式
装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...
- java中装饰器_Java设计模式12:装饰器模式
装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...
- 设计模式--装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.简单来说,装饰器模式就是 ...
- java设计模式之 装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...
- 设计模式-装饰器模式 C++
一.简介 1.什么是装饰器模式 装饰器模式是结构型设计模式. 装饰器是现有类的一个包装,可以在不修改现有类且不增加子类的情况下扩展现有类. [注]可以实现向一个现有对象添加新的功能,同时又不改变其结构 ...
- 【设计模式】【结构型模式】装饰器模式
概念 定义 装饰模式指动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包 ...
最新文章
- LeetCode简单题之最常见的单词
- redis主从复制、高可用和集群
- Oracle undo表空间
- (转载)配置apue.h
- Microsoft SQL Server学习(二)--数据库的语法
- c语言或者cpp中位运算的技巧
- 揭开并发包底层AQS的神秘面纱
- 北斗导航 | 获取观测卫星的位置信息,并绘制卫星的方位角和仰角得到星空图:GSV语句(附Matlab源代码)
- 每日一测5(关于继承)
- linux下抓包学习--tcpdump的使用
- [php] 表单注意事项
- Java 常见面试题
- 郑州大学“战疫杯”大学生程序设计在线邀请赛(6)(C++题解+详细思路)2022年5月14日
- Android UI自动化工具-SoloPi
- MQTT:QoS服务质量 0,1,2(Quality of Service 0, 1 2)
- wlop一张多少钱_小白有个问题,为什么很多人都说 WLOP 的画不够好?
- SIPM模拟器 MIPS汇编语言实现读取文件
- it-tidalwave-semantic-aux-1.0.5.jar下载
- [UNR#5]诡异操作
- centos7搭建集群过程
热门文章
- npoi ppt html,NPOI(示例代码)
- 网站设置隐藏友情链接的方法!
- C# 三十二、Hashtable(哈希表)
- 知识小罐头06(tomcat8请求源码分析 中)
- abap中的BAPI_ASSET_RETIREMENT_POST (固定资产报废BAPI)
- PHP 实现全站静态化 首页静态化 列表页静态化 内容静态化 .
- 唉……今天还是出门了……还是陪别人出门……
- 二维数组排序算法php,phpsort_php二维数组排序方法
- 如何用最小代价,迅速提高你项目中“shit,android设计模式有几种
- 电脑计算机丢失很多东西怎么办,电脑缺少dll文件怎么办