资讯专栏INFORMATION COLUMN

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

RebeccaZhong / 2444人阅读

摘要:装饰器模式在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。通过使用装饰器模式,我们可以实现关闭原有代码,开放现有代码的方式来实现更多的功能。

目录

装饰器模式

为什么使用装饰器模式

应用实例

装饰器模式

看到装饰器是在看《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库具有两个对称性,它们分别是:

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

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();

下篇更命令模式

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64604.html

相关文章

  • 【用故事解读 MobX 源码(四)】装饰 和 Enhancer

    摘要:所以这是一篇插队的文章,用于去理解中的装饰器和概念。因此,该的作用就是根据入参返回具体的描述符。其次局部来看,装饰器具体应用表达式是,其函数签名和是一模一样。等装饰器语法,是和直接使用是等效等价的。 ================前言=================== 初衷:以系列故事的方式展现 MobX 源码逻辑,尽可能以易懂的方式讲解源码; 本系列文章: 《【用故事解...

    maybe_009 评论0 收藏0
  • 包装模式就是这么简单啦

    摘要:包装模式是这样干的首先我们弄一个装饰器,它实现了接口,以组合的方式接收我们的默认实现类。其实装饰器抽象类的作用就是代理核心的功能还是由最简单的实现类来做,只不过在扩展的时候可以添加一些没有的功能而已。 前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 前一篇已经讲解了代理模式了,今天要讲解的就是装饰模式啦~ 在看到FilterInputStream和FilterOutpu...

    Developer 评论0 收藏0
  • 【用故事解读 MobX 源码(五)】 Observable

    摘要:前言初衷以系列故事的方式展现源码逻辑,尽可能以易懂的方式讲解源码本系列文章用故事解读源码一用故事解读源码二用故事解读源码三用故事解读源码四装饰器和用故事解读源码五文章编排每篇文章分成两大段,第一大段以简单的侦探系列故事的形式讲解所涉及人物场 ================前言=================== 初衷:以系列故事的方式展现 MobX 源码逻辑,尽可能以易懂的方式...

    leeon 评论0 收藏0
  • python设计模式-装饰模式

    摘要:这种模式我们称之为装饰器模式。因为装饰器模式是在给对象增加责任。以下情况适合使用装饰器模式在不影响其他对象的情况下,以动态透明的方式给单个对象添加职责。 前言 本篇的装饰器模式不是讲解的python中的语法糖 @ 这个装饰器。而是讲解设计模式中的装饰器模式。网上很多的实现都是基于java和c++的。本文则使用python来实现,其中有些实现可能在python并不需要那样来写的,但是思路...

    Yuqi 评论0 收藏0
  • 从ES6重新认识JavaScript设计模式: 装饰模式

    摘要:什么是装饰器模式向一个现有的对象添加新的功能,同时又不改变其结构的设计模式被称为装饰器模式,它是作为现有的类的一个包装。中的装饰器模式中有一个的提案,使用一个以开头的函数对中的及其属性方法进行修饰。 1 什么是装饰器模式 showImg(https://segmentfault.com/img/remote/1460000015970102?w=1127&h=563); 向一个现有的对...

    wendux 评论0 收藏0

发表评论

0条评论

RebeccaZhong

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<