装饰模式

JAVA23种设计模式之一,英文叫Decorator Pattern,又叫装饰者模式。装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能.

 1、装饰模式与类继承的区别:

1)    装饰模式是一种动态行为,对已经存在类进行随意组合,而类的继承是一种静态的行为,一个类定义成什么样的,该类的对象便具有什么样的功能,无法动态的改变。

  所谓动态是说可以在系统运行时(RunTime)动态给对象增加其它职责而不需要修改代码或重新编译;所谓静态是说必须通过调整代码(DesignTime)才能给对象增加职责,而且系统还需要重新编译;从具体技术层面来说,对象的组合和继承正好对应于前面的动态和静态,因为通过对象组合建立的交互关系不是在代码中(DesignTime)固定死的,而是在运行时(RunTime)动态组合的;而通过继承建立的关系是僵硬的难以改变的,因为它是在代码中(DesignTime)固定死了的,根本不存在运行时(RunTime)改变的可能。换个角度说:我们应该多使用对象组合来保持系统的运行时扩展性,尽量少使继承。

2)    装饰模式扩展的是对象的功能,不需要增加类的数量,而类继承扩展是类的功能,在继承的关系中,如果我们想增加一个对象的功能,我们只能通过继承关系,在子类中增加两个方法

2、  装饰模式的特点:

1)    装饰对象和真实对象具有相同的接口,这样客户端对象就可以以真实对象的相同的方式和装饰对象交互。

2)    装饰对象包含一个真实对象的引用(reference).

3)    装饰对象接受所有来自客户端的请求,它把这些请求转发给真实的对象。

4)    装饰对象可以在转发这些请求以前或者以后增加一些附加的功能。这样就能确保在运行时,不用修改给定对象结构就可以在外部增加附加的功能。在面向对象的程序设计中,通常是使用继承的关系来扩展给定类的功能

3、装饰模式的实现:

 

clip_image002 

Component:

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

public interface Component
{void operation();
}

Concrete Component:

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

public class ConcreteComponent implements Component
{public void operation(){// Write your code here}
}

 Decorator:

维持一个指向Component对象的引用,并定义一个与 Component接口一致的接口。

public class Decorator implements Component
{public Decorator(Component component){this.component = component;}public void operation(){component.operation();}private Component component;
}

 Concrete Decorator:

在Concrete Component的行为之前或之后,加上自己的行为,以“贴上”附加的职责。

public class ConcreteDecorator extends Decorator
{public void operation(){//addBehavior也可以在前面super.operation();addBehavior();}private void addBehavior(){//your code}
}
public class Client
{   
  public static void main(String[] args)   
  {    
       Component component = new ConcreteDecorate(new ConcreteComponent());     
     component.doSomething();   
  }
}
 

1. 如果只有一个Concrete Component类而没有抽象的Component接口时,可以让Decorator继承Concrete Component。

clip_image004

2. 如果只有一个Concrete Decorator类时,可以将Decorator和Concrete Decorator合并。

clip_image006 

 Decorator是装饰者模式里非常特殊的一个类,它既继承于Component【IS A关系】,又维护一个指向Component实例的引用【HAS A关系】,换个角度来说,Decorator跟Component之间,既有动态组合关系又有静态继承关系,WHY? 这里为什么要这么来设计?上面我们说过,组合的好处是可以在运行时给对象增加职责,Decorator【HAS A】Component的目的是让ConcreteDecorator可以在运行时动态给ConcreteComponent增加职责,这一点相对来说还比较好理解;那么Decorator继承于Component的目的是什么?在这里,继承的目的只有一个,那就是可以统一装饰者和被装饰者的接口,换个角度来说,不管是ConcretComponent还是ConcreteDecorator,它们都是 Component,用户代码可以把它们统一看作Component来处理,这样带来的更深一层的好处就是,装饰者对象对被装饰者对象的功能职责扩展对用户代码来说是完全透明的,因为用户代码引用的都是Component,所以就不会因为被装饰者对象在被装饰后,引用它的用户代码发生错误,实际上不会有任何影响,因为装饰前后,用户代码引用的都是Component类型的对象,这真是太完美了!装饰者模式通过继承实现统一了装饰者和被装饰者的接口,通过组合获得了在运行时动态扩展被装饰者对象的能力。

给一个对象动态添加额外职责,这些职责需要由用户决定加入的方式和时机。装饰模式提供了“即插即用”的方式,在运行期间决定何时增加何种功能。就增加功能来说,装饰模式比生成子类更加灵活。

转载于:https://www.cnblogs.com/muyuhu/archive/2013/04/29/3050346.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win11安卓极速教程!

适用于 Android 的 Windows 子系统(以下简称“WSA”)使你的 Windows 11 电脑能够运行 Android 应用。※ 如何在 Windows 11 上运行 Android 应用此前的教程较为详细,但也繁琐,尤其是 adb 部署部分,不适合新手入门&…

ubuntu12.04 使用gedit 打开txt文件中文乱码的处理方法

2019独角兽企业重金招聘Python工程师标准>>> gedit --encodingGB18030 filename.txt 转载于:https://my.oschina.net/zhangdapeng89/blog/58965

你最擅长哪种数学思维?

全世界只有3.14 % 的人关注了爆炸吧知识许多人会抱怨说,自己没有“数学头脑”。事实上,数学家会以各种各样的方式思考,根本没有所谓的哪种思考数学的方式是正确的。但这很可能造成沟通上的障碍,试想一下,一个用视觉图像…

励志!送女儿去厦大读研后,爸爸回家就考了厦大的博士,现在是女儿的“学弟”...

全世界只有3.14 % 的人关注了爆炸吧知识2020上半年,在安徽阜阳家里,女儿王睿在房间内上着厦门大学在线专业课,父亲王健作为师范高校教师直播着自己的思政公共课和生命教育有关课程。然而一到周末,王健也和女儿一样,作为…

C# WPF MVVM模式Prism框架从零搭建(经典)

01—前言目前最新的PRISM的版本是8.1.97,本节以6.3.0.0 讲解,可以在Github上获取PRISM的源码。Prism Github地址:https://github.com/PrismLibrary/PrismPrism官方文档:https://prismlibrary.com/docs/Prism要用到IOC容器&#xf…

在中国,有这样一些村落

全世界只有3.14 % 的人关注了爆炸吧知识01地坑村在河南有一个全球最神奇的村落这村子神奇就神奇在当你走进村子能听到家家户户的吵闹声却见不到一座房子原来村落居然建在地底下基本不用与外界接触但村子却被外国媒体争相报道火的一塌糊涂更不可思议的是村里的老人平均寿命都超1…

2-2

为方便储户,某银行拟开发计算机储蓄系统。储户填写的存款单或取款单由业务员输入系统,如果是存款,系统记录存款人姓名、住址、存款类型、存款日期、利率等信息,并印出存款单给储户;如果是取款,系统计算利息…

.NET 6新特性试用 | 隐式using指令

前言在使用《最小Web API》时,我们发现,相比以前的代码,大量的using指令消失了:using指令的主要作用是允许使用在命名空间中定义的类型,而无需指定该类型的完全限定命名空间。那么,在.NET 6下为什么不需要了…

6部有生之年必看的BBC “教材级” 地理纪录片,免费领取!

看BBC的纪录片,既可以追溯上下数千年的历史文化,也可以欣赏从宇宙到地心深处的奇妙境界,而及其超级精彩的画面即使定格,也是一幅摄影佳作。BBC纪录片题材广泛、制作精良,观看起来算的上是赏心悦目。对于学习英文&#…

blazor wasm开发chrome插件

用blazor(Wasm)开发了一个chrome插件感觉效率挺高的,分享给大家先简单介绍下WebAssembly的原理:“WebAssembly是一种用于基于堆栈的虚拟机的二进制指令格式”image如上图,浏览器在执行js时是会经历 Parser转成语法树->Compiler转成字节码-…

求偶的两种方法

import java.util.Scanner;public class Testif {public static void main(String[] args) {// TODO 自动生成的方法存根Scanner scan new Scanner(System.in);System.out.println("请输入一个整数:");long number scan.nextLong(36);String check (numbe…

idea zookeeper的使用_学习ZooKeeper源码,就从这篇开始吧

【ZooKeeper系列】1.ZooKeeper单机版、伪集群和集群环境搭建【ZooKeeper系列】2.用Java实现ZooKeeper API的调用在系列的前两篇文章中,介绍了ZooKeeper环境的搭建(包括单机版、伪集群和集群),对创建、删除、修改节点等场景用命令行的方式进行了测试&…

都才40出头,近一个月已有至少5名优秀青年学者英年早逝!健康不容忽视

全世界只有3.14 % 的人关注了爆炸吧知识近年来,在工作、生活的层层重压下,正处于事业上升期的科研人员因病逝世的消息屡屡传出。据不完全统计,仅仅今年10月份至今,短短一个多月时间里,已有至少5位优秀青年学者倒下。他…

基于 Spring Security 的开源统一角色访问控制系统 URACS

URACS Java语言开发的统一角色访问控制系统(Unified Role Access Control System),基于Spring Security 3实现的权限控制系统 程序框架版本说明:Spring MVC 3.0.6 Spring Security 3.1.3 Hibernate 3.6.10 运行演示例子: 例子使用的是MySQL…

Chatopera 王海良:做好开源客服系统

| 作者:王海良| 编辑:刘雪洁| 设计:马丽娜| 责编:王玥敏做好开源客服系统,是我最近的心心念念的事情之一。我想讲的故事,就包括春松客服,一个开源的客服系统。篇章有限,我想从三点来…

mysql_contents_将MySQLhelpcontents的内容有层次的输出方法推荐

经常会遇到这种情况,在一个不能上网的环境通过MySQL客户端登录数据库,想执行一个操作,却忘了操作的具体语法,各种不方便。其实,MySQL数据库内置了帮助文档,通过help contents即可查看。如下所示&#xff1a…

点开那些优秀的硕博士们的朋友圈,他们都有这些特点!

全世界只有3.14 % 的人关注了爆炸吧知识很多同学都会有这种感觉,读了硕士博士后,兴趣会突然间发生很大变化,发朋友圈也会不一样了。例如,合格的学术研究者,要快速、全面的获取各种最新文献和学界动态;还要持…

java foreach 跳过本次循环_【Java】对foreach循环的思考

阿里java开发手册已经发表,很多都值得认真研究思考,看到零度的思考题,没忍住研究了一下。在这里插入图片描述首先,看一下给出的反例的执行结果。如果是"1",最后list中的元素为["2"]如果把"1&…

地球上这10个奇幻景观,带你踏入外太空

全世界只有3.14 % 的人关注了爆炸吧知识大蓝洞大蓝洞是灯塔礁的一部分,位于洪都拉斯伯利兹城陆地大约100公里之遥,是一个较大的完美环状海洋深洞,是当今世界最吸引人的潜水地点之一。305米的口径,123米的洞深,洞口呈现…

OSChina 周六乱弹 —— 有人骂你神经病怎么办?

2019独角兽企业重金招聘Python工程师标准>>> 周六了,大家有没有在认真加班呢?其实咱们程序员的生活真的不容易 熊大信了熊二的话:程序员的人生 码代码不容易,咱们还是去抢银行吧 sunny_chan:一天老师让同学…