资讯专栏INFORMATION COLUMN

装饰者模式与其在Java API中的运用

weapon / 859人阅读

摘要:基本原理通过使用装饰者模式,可以在运行时扩充一个类的功能。装饰者模式是类继承的另外一种选择。相反,装饰者模式是面向运行时候的对象实例的这样就可以在运行时根据需要进行组合。一个装饰者模式的示例是里的的实现。

一、装饰者模式简介

装饰者模式,是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式。就功能而言,装饰者模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。

1.基本原理

通过使用装饰者模式,可以在运行时扩充一个类的功能。原理是:增加一个装饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。装饰类必须和原来的类有相同的接口。

装饰者模式是类继承的另外一种选择。类继承在编译时候增加行为,而装饰者模式是在运行时增加行为。

当有几个相互独立的功能需要扩充时,这个区别就变得很重要。在有些面向对象的编程语言中,类不能在运行时被创建,通常在设计的时候也不能预测到有哪几种功能组合。这就意味着要为每一种组合创建一个新类。相反,装饰者模式是面向运行时候的对象实例的,这样就可以在运行时根据需要进行组合。一个装饰者模式的示例是JAVA里的Java I/O Streams的实现。

装饰者模式的UML类图:

2.示例代码

砂锅羊肉面 为实例,别问为什么,(╯°□°)╯︵┻━┻

Component相当于Marmite(砂锅)类:

public abstract class Marmite {
    String description = "砂锅";

    public String getDescription() {
        return description;
    }

    public abstract Integer cost();

    @Override
    public String toString() {
        return "这是一碗:" + getDescription() + ",价格:" + cost() + "元";
    }
}

ConcreteComponent是NoddlesMarmite(砂锅面条)类:

public class NoddlesMarmite extends Marmite {

    public NoddlesMarmite() {
        description = "砂锅面条";
    }

    public Integer cost() {
        return 8;
    }
}

Decorator是MaterialDecorator

public abstract class MaterialDecorator extends Marmite {
    public abstract String getDescription();
}

ConcreteDecorator是MuttonMarmite:

public class MuttonMarmite extends MaterialDecorator {
    Marmite marmite;

    public MuttonMarmite(Marmite marmite) {
        this.marmite = marmite;
    }

    @Override
    public String getDescription() {
        return "羊肉、" + marmite.getDescription();
    }

    @Override
    public Integer cost() {
        return 5 + marmite.cost();
    }
}

这是测试代码:

public class MarmiteTest {
    public static void main(String[] args) {
        Marmite marmiteNoddle = new NoddlesMarmite();
        System.out.println(marmiteNoddle.toString());
        Marmite muttonMarmiteNoddle = new MuttonMarmite(marmiteNoddle);
        System.out.println(muttonMarmiteNoddle.toString());
    }
}
二、Java API中装饰者的运用

先看一段demo

public class JavaDemo {
    public static void main(String[] args) {
        System.out.println("请输入一句话:");
        BufferedInputStream bufferedInputStream = new BufferedInputStream(System.in);
        String msg = "wocao";
        try {
            BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(bufferedInputStream));
            msg = bufferedReader.readLine();
        } catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("输入的是:" + msg);
    }
}

这段代码的功能是将控制台中输入的内容打印出来。

查看java api得知
BufferedInputStream继承的是FilterInputStream,如下图:

FilterInputStream继承的是InputStream,并且有InputStream对象的一个引用

由此可以得出

InputStream相当于Component,FileterInputStream相当于Decorator,BufferedInputStream相当于ConcreteDecorator,System.in相当于ConcreteComponent。

三、自己实现一个关于InputStream的ConcreteDecorator

talk is cheap, show me the code

public class LowerCaseInputStream extends FilterInputStream {

    public LowerCaseInputStream(InputStream in){
        super(in);
    }

    @Override
    public int read() throws IOException {
        int c=super.read();
        return (c==-1?c:Character.toLowerCase((char)c));
    }

    @Override
    public int read(byte[] b, int off, int len) throws IOException {
        int result=super.read(b,off,len);
        for(int i=off;i

不想解释了,心累
看不懂的,送你一幅图:

---------------------------------------EOF--------------------------------------

参考资料:

https://zh.wikipedia.org/wiki...

Head First设计模式

我的心愿是世界和平!~( ゜▽゜)つロ

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

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

相关文章

  • 接口

    摘要:前言这一系列的文章将主要基于设计模式这本书的要点还有一些翻阅的博客文章借鉴来源会注明外加自己的一些与直觉不同于其他设计模式类的书设计模式是一本讲述设计模式在动态语言中的实现的书它从设计的角度教人编写代码书中的许多实例代码来自实战项目对面向对 前言 这一系列的文章将主要基于js设计模式这本书的要点还有一些翻阅的博客文章,借鉴来源会注明,外加自己的一些demo与直觉.不同于其他设计模式类的...

    zhjx922 评论0 收藏0
  • Java IO : 流,以及装饰模式其上的运用

    摘要:从应用流向目的地称为输出流,从目的地流向应用称为输入流。装饰器模式装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构。以及家属对于装饰器模式的体现,也以此类推。 流概述 Java中,流是一种有序的字节序列,可以有任意的长度。从应用流向目的地称为输出流,从目的地流向应用称为输入流。 Java的流族谱 Java的java.io包中囊括了整个流的家族,输出流和输入流的谱系如下所示...

    fuyi501 评论0 收藏0
  • 一文理清21种设计模式:用实例分析和对比

    摘要:设计模式无论是对于最底层的的编码实现还是较高层的架构设计都有着重要的指导作用。所谓光说不练假把式,今天我就把项目中常见的应用场景涉及到的主要设计模式及其相关设计模式总结一下,用实例分析和对比的方式在一片文章中就把最常见的种设计模式梳理清楚。 设计模式无论是对于最底层的的编码实现还是较高层的架构设计都有着重要的指导作用。所谓光说不练假把式,今天我就把项目中常见的应用场景涉及到的主要设计模...

    PrototypeZ 评论0 收藏0
  • 开发之路(设计模式三:装饰模式

    摘要:若要扩展功能,装饰者提供了比继承更有弹性的替代方案。装饰者模式意味着一群装饰者类,这些类用来包装具体组件。装饰者类反映出被装饰组件类型。装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂。 嘿嘿嘿,你是不是很喜欢用继承呢?感觉没什么事情是一个爸爸类搞不定的,有的话就两个,快来跟我看看这个模式吧,它能让你断奶,给爱用继承的人一个全新的设计眼界。 直奔主题,你是否有听说...

    Vicky 评论0 收藏0
  • 美颜相机中的设计模式 —— 装饰模式

    摘要:这是设计模式系列的第二篇,系列文章目录如下用一句话总结那些殊途同归的设计模式工厂策略模版方法美颜相机中的设计模式装饰者模式几乎所有的设计模式都是通过增加一层抽象来解决问题。 这是设计模式系列的第二篇,系列文章目录如下: 用一句话总结那些殊途同归的设计模式:工厂=?策略=?模版方法 美颜相机中的设计模式——装饰者模式 几乎所有的设计模式都是通过增加一层抽象来解决问题。 上一篇中提...

    anonymoussf 评论0 收藏0

发表评论

0条评论

weapon

|高级讲师

TA的文章

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