装饰器模式(讲解+应用)

转载自 设计模式(5)装饰器模式(讲解+应用)

目录

  1. 装饰器模式

  2. 为什么使用装饰器模式

  3. 应用实例

装饰器模式

看到装饰器是在看《Thinking in Java》一书的时候,看到文件读写那边的时候,有提到装饰器模式,同时在文件读写的那一部分,对于各种读入,写出的方式,代码组织结构感觉也是比较怪的,怪的总是吸引人的。

装饰器模式:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

通过使用装饰器模式,我们可以实现关闭原有代码,开放现有代码的方式来实现更多的功能。通过减少对原有代码的改变,来降低犯错误的几率。不改变妹子的三围,通过装饰不同的制服,实现一个动态扩展,我们就会看到教师,护士,,,其本质功能还是未改变的,只是体验更上一层楼。。。

为什么使用装饰器模式

继续上面的需求来举例子吧,现在我们要针对该服务场所制定一个订单系统,当客户来选择的时候,点一项服务,我们需要向订单中加入一项,然后最后计算一个总和,由于young woman,student,nurse等基础价格是不同的,假设在其基础之上的单项服务价格是相同的,首先我们想到的可能是根据不同的类型继承自一个基类,建立一个类,然后每个作为一个实例,将各项服务作为一个全局变量,然后各项服务有一个set方法,用来改变这些服务的状态,两次调用可以取消该服务,默认各项服务的状态是关闭的,然后最后通过一个cost方法判断各种服务的来计算总价格,当然感觉这是一个很不错的方法。但是由于某种服务的特殊性原因,能提供该服务的人减少,所以该服务价格上涨,或者是在某种服务在一个不小心中诞生,因此,我们需要打开源代码进行添加一些服务,然后需要添加set方法,同时,我们需要对cost进行修改,随着人民思路不断开阔,冒险精神日益增强,各种服务如雨后春笋,我们的维护工作将变得比工作人员还要辛苦了。这个时候,就要引出我们的装饰器模式,我们将所有需要付费的拿出来,因为我们在后期的维护上,就是价格导致的变化给我们带来了困扰,所以如果将这些变化的价格拿出来,单独维护,我们的工作量将会减少。如下结构

//基础抽象类
public abstract class SexService{String description = "Best Service";public String getDescription(){return description;}public abstract int cost();
} 
//继承自抽象类的本体
public class Nurse extends SexService{public Nurse(){description = "You konw";}public int cost(){return 150;}
}
//继承自基础类的用来修饰本体的类
public class PlayXiao extends SexService{SexService service;public PlayXiao(SexService service){this.service = service;}public String getDescription(){return service.getDescription+"PlayXiao";}public int cost(){return service.cost+50;}}

调用方式

Nurse sweetHeart = new Nurse();
sweetHeart = new PlayXiao(sweetHeart);

首先我们创建一个本体类,然后将其作为一个实例通过构造函数注入到一个装饰类,在装饰类内部通过委托的形式获得当前的价格和描述,同时由于本体类和装饰类继承自同一个基类,所以可以用来继续向下传递。
基础抽象类,通过构造函数进行实例注入,通过委托实现状态,数据更新,从而实现关闭原有代码,开放现有代码。

应用实例

言归正传,回到正题上来,讲一下其在我们平常开发中的例子
开始也提到了一点关于Java,io库的问题
java I/O库具有两个对称性,它们分别是:

  1. 输入-输出对称:比如InputStream 和OutputStream 各自占据Byte流的输入和输出的两个平行的等级结构的根部;而Reader和Writer各自占据Char流的输入和输出的两个平行的等级结构的根部。

  2. byte-char对称:InputStream和Reader的子类分别负责byte和Char流的输入;OutputStream和Writer的子类分别负责byte和Char流的输出

这些作为根类,如果我们想通过缓冲,字节,或者是管道,这个时候我们就需要使用装饰器来进行装饰,然后通过装饰器来实现相应的操作,根类具有read方法,对于装饰类,通过构造函数将基类的一个实例注入进去,然后通过委托模式,首先通过基类的read方法获取字节流,然后根据相应的操作,实现字节读取等。

InputStreamReader input = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(input);
String line = reader.readLine();

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

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

相关文章

quarkus_使用Quarkus调试容器中的系统测试(视频)

quarkus如果您能够借助容器在本地进行端到端测试应用程序,则可以提高开发效率。 在下面的视频中,我将展示如何使用Quarkus在Docker容器中调试本地系统测试。 这是我关于有效测试的视频课程的Quarkus扩展。 要全面了解,还可以查看以下资源&a…

MySQL事务管理+安全管理+MySQL数据类型

【0】README0.1)本文部分文字描述转自“MySQL 必知必会”,旨在review“MySQL事务管理安全管理MySQL数据类型” 的基础知识;【1】管理事务处理【1.1】事务处理1)并非所有引擎都支持事务管理,MyISAM 不支持,而…

超音速 启动_从根本上讲超音速亚原子Enterprise Java

超音速 启动我创建了一个视频,其中我用Quarkus解释了“超音速亚原子Java”,这是现代Java应用程序的运行时。 无论您是刚开始涉足Enterprise Java领域,还是已经是一位经验丰富的Java EE / J2EE开发人员,本课程都将指导您如何在2020…

利用java求积分(定积分和无穷限积分)

【0】README0.1)本文部分文字描述转自或译自 https://en.wikipedia.org/wiki/Simpson%27s_rule和 https://en.wikipedia.org/wiki/Numerical_integration#Methods_for_one-dimensional_integrals;旨在利用java求积分;(定积分和无穷…

Java的三种代理模式

转载自 Java的三种代理模式1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一个思想:不要随意去修改别人已经写好的…

后台审核管理 ergo_Kogito,ergo规则:从知识到服务,轻松自如

后台审核管理 ergo欢迎阅读有关Kogito倡议的博客系列的另一集,以及我们将Drools带入云的努力。 这些文章的目的是收集用户对我们提供给Kogito的功能的早期反馈。 在本文中,我们介绍了两种实现完整智能服务的新方法 : 独立的规则服务 集成智…

java转换文本文件到xlsx(自制缓冲区,无需先验文件行数)

【0】README0.1)本文代码利用了 Apache POI 框架 建立 java 到 xlsx 代码的联系;0.2)本文自制缓冲区从文本文件中读取数据读取,无需先验文件行数;0.3)本文通过缓冲区大小创建数组,数组容量自动增…

spring react_使用Spring WebFlux构建React性REST API –第3部分

spring react在上一篇文章的续篇中,我们将看到一个应用程序以公开React性REST API。 在此应用程序中,我们使用了 带有WebFlux的Spring Boot 具有响应式支持的Cassandra的Spring数据 卡桑德拉数据库 下面是应用程序的高级体系结构。 让我们看一下bui…

tomcat(12)org.apache.catalina.core.StandardContext源码剖析

【0】README0)本文部分文字描述转自 “how tomcat works”,旨在学习 “tomcat(12)StandardContext源码剖析” 的基础知识;1)Context实例表示一个具体的web 应用程序,其中包含一个或多个Wrapper实例,每个Wra…

jms面试题_最新的20多个JMS面试问答(2020)

jms面试题快速浏览JMS(Java消息服务)常见问题面试问题和答案。 2020年以来的最新问题已添加到列表中。 1.简介 在本教程中,我们将了解2020年经常问到的JMS面试问题。作为面试的一部分,如果您有6年以上的经验,就有机会…

tomcat(13)Host和Engine容器

【0】README0.1)本文部分文字描述转自 “how tomcat works”,旨在学习 “tomcat(13)Host和Engine容器” 的基础知识;0.2)Host容器:若你想在同一个tomcat部署 上运行多个Context 容器的话,就需要使用 Host 容…

spring react_使用Spring WebFlux构建React性REST API –第2部分

spring react在上一篇文章的续篇中,我们将看到React式流规范及其实现之一,称为Project Reactor 。 React流规范定义了以下接口。 让我们看看这些接口的细节。 发布者→发布者是潜在数量不受限制的序列元素的提供者,可按其订阅者的要求发布它…

tomcat(14)服务器组件和服务组件

【0】README0.1)本文部分文字描述转自 “how tomcat works”,旨在学习 “tomcat(14)服务器组件和服务组件” 的基础知识;0.2)for complete source code ,please visit https://github.com/pacosonTang/HowTomcatWorks/tree/maste…

组合模式的安全模式与透明模式

转载自 树形结构的处理——组合模式(四) 1 透明组合模式与安全组合模式 通过引入组合模式,Sunny公司设计的杀毒软件具有良好的可扩展性,在增加新的文件类型时,无须修改现有类库代码,只需增加一个新的文件类…

spring react_使用Spring WebFlux构建React性REST API –第1部分

spring react在本文中,我们将看到如何使用Spring WebFlux构建响应式REST API。 在进入React式API之前,让我们看看系统是如何发展的,传统REST实现遇到的问题以及现代API的需求。 如果您查看从旧版系统到下文所述的现代系统的期望,…

tomcat(15)Digester库

【0】README0.1)本文部分文字描述转自 “how tomcat works”,旨在学习 “tomcat(15)Digester库” 的基础知识;2)problemsolution:2.1)problem:如下面的代码,Bootstrap类实例化连接器…

api restful_HATEOAS的RESTful服务。 记录超媒体API

api restful1.简介 希望本教程的前一部分不仅揭示了超媒体和HATEOAS的深远意义,而且使我们确信这些都是RESTful Web服务和API的基本构建模块。 在这一部分中,我们将继续侧重于文档方面,以解决如何预先传递Web服务或API功能的问题。 目录 1.…

模版方法模式

转载自 23种设计模式(6):模版方法模式定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。 类型:行为类模式 类图&#…

java并发编程实践(1)intro

【0】README0.1)本文部分文字描述转自“java并发编程实践”,旨在学习“java并发编程实践(1)intro”的相关知识;【3】线程带来的风险【3.1】安全性问题1)intro:在没有充足同步的case下,多个线程的操作执行顺…

读入的字节都写入字节数组中_使用Java将文件读入字节数组的7个示例

读入的字节都写入字节数组中嗨,大家好,Java程序员经常在现实世界中遇到编程问题,他们需要将文件中的数据加载到字节数组中,该文件可以是文本文件或二进制文件。 一个示例是将文件的内容转换为String以显示。 不幸的是,…