设计模式7:装饰者模式

这篇具有很好参考价值的文章主要介绍了设计模式7:装饰者模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

装饰者模式是要解决什么问题?

官方说法:装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。

个人理解:原始接口功能不足,需要添加新方法,但是别的地方已经实现了原始接口,所以原始接口又不能直接添加方法。这时候可以采用持有原始类对象,并且添加新方法的方式,实现新功能。并且继承原始类或者实现原始接口,达到可替换原始类的目的。

装饰者模式在JDK中有哪些实际应用?

FilterInputStream
InputStream是一个抽象类,源码:

public abstract class InputStream implements Closeable {
    ...
    public abstract int read() throws IOException;    
    ...
}

InputFilterStream源码:

public
class FilterInputStream extends InputStream {

    protected volatile InputStream in;
    ...

    public int read() throws IOException {
        return in.read();
    }
	...
}

BufferedInputStream源码:

public
class BufferedInputStream extends FilterInputStream {

    public BufferedInputStream(InputStream in) {
        this(in, DEFAULT_BUFFER_SIZE);
    }
    
    public BufferedInputStream(InputStream in, int size) {
        super(in); //注意这里调用了FilterInputStream的构造器
        if (size <= 0) {
            throw new IllegalArgumentException("Buffer size <= 0");
        }
        buf = new byte[size];
    }

    public synchronized int read() throws IOException {
        if (pos >= count) {
            fill();
            if (pos >= count)
                return -1;
        }
        return getBufIfOpen()[pos++] & 0xff;
    }

	...

    private InputStream getInIfOpen() throws IOException {
        InputStream input = in;
        if (input == null)
            throw new IOException("Stream closed");
        return input;
    }

	...
	
}

三个类完整的方法:
InputStream是抽象类,且只有一个抽象方法。
设计模式7:装饰者模式,设计模式,设计模式,java,开发语言
FilterInputStream并没有增加方法,只是持有了InputStream的实例。
设计模式7:装饰者模式,设计模式,设计模式,java,开发语言

BufferedInputStream增加了几个方法,例如:getInIfOpen()
设计模式7:装饰者模式,设计模式,设计模式,java,开发语言

使用BufferedInputStream:

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("/home/user/abc.txt")));

Java IO 中的流与设计模式

装饰者模式在Android SDK中有哪些实际应用?

  • ContextWrapper与Application、Activity。具体参考:设计模式(十一)Context中的装饰者模式
    网上有些博客讲用装饰者模式给RecyclerView添加Header。例如:装饰者设计模式-RecyclerView添加头部和底部 ,我没有仔细分析,不下结论。

装饰者模式和适配器模式的区别是什么?

简单讲:装饰者模式解决的是原始类功能不足的问题。适配器模式解决的是原始类有这个功能,但是功能不匹配的问题。
例如原始类有裤子,但是没有鞋子,这个时候用装饰器模式。原始类有鞋子,但是鞋码大了,不合适,这个时候用适配器模式。

装饰者模式:

  • 装饰者模式(Decorator Pattern)目的是为原始类对象动态地添加新功能。解决原始类功能不足的问题。
  • 装饰者类起功能增强作用。
  • 继承原有类,创建一个装饰器类,将原始类对象包装在装饰器中,以组合的方式来添加功能。

适配器模式:文章来源地址https://www.toymoban.com/news/detail-527932.html

  • 适配器模式(Adapter Pattern)目的是为了实现目标接口,解决原始类功能不匹配的问题。使目标接口和原始类进行交互。
  • 适配器类起一个桥梁的作用。
  • 适配器模式通过创建一个适配器类,配合原始类的方法,实现目标接口的方法。

装饰者模式和代理模式的区别是什么?

  • 目的不同:装饰者模式是为了扩展原有对象的功能,在装饰者中添加新的方法。代理模式是为了控制原有对象的访问,在原有对象的方法上做了修改。
  • 方法数量不同:装饰者模式中,装饰者的方法数量比被装饰者多,因为要添加新的方法。代理模式一般情况下方法数量和父类相同。
  • 原有对象访问修饰符不同:装饰者模式中,原有对象的访问修饰符一般是protected

到了这里,关于设计模式7:装饰者模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【设计模式——学习笔记】23种设计模式——装饰器模式Decorator(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    【设计模式——学习笔记】23种设计模式——装饰器模式Decorator(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    在咖啡厅中,有多种不同类型的咖啡,客户在预定了咖啡之后,还可以选择添加不同的调料来调整咖啡的口味,当客户点了咖啡添加了不同的调料,咖啡的价格需要做出相应的改变。 要求 :程序实现具有良好的拓展性、改动方便、维护方便 【方案一】 写一个抽象类Drink,然

    2024年02月15日
    浏览(19)
  • 简化代码结构与提高灵活性:学习Java设计模式中的装饰器模式

    简化代码结构与提高灵活性:学习Java设计模式中的装饰器模式 在软件开发中,我们经常会遇到需要在不修改现有代码的情况下,对已有对象进行功能扩展或修改的需求。此时,装饰器模式就是一种非常有用的设计模式,它通过动态地将责任附加到对象上,来扩展对象的功能

    2024年02月16日
    浏览(12)
  • 【Java面试题】设计模式之七种结构性模式——代理模式、适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式

    目录 一、代理模式 二、适配器模式 三、桥接模式 四、装饰模式 五、外观模式 六、享元模式 七、组合模式 概念: 代理模式是为其他对象提供一种以代理控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对

    2023年04月09日
    浏览(15)
  • 设计模式——装饰者模式

    设计模式——装饰者模式

    更多内容,前往 IT-BLOG 现实生活中常常需要给某类产品动态增加新的功能,如:给面条各种调味品。在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成一些核心功能。但在不改变其架构的情况下,可以动态地扩展其功能。所以这些都可以采用装饰模式来实

    2024年02月22日
    浏览(7)
  • 设计模式-装饰器模式

    设计模式-装饰器模式

    装饰者模式的定义为:动态的给一个对象添加其它功能。 从扩展性来说,这种方式比继承更有弹性,更加灵活,装饰者模式也体现了开闭原则(OCP)。 星巴克咖啡订单项目(咖啡馆) : 1)咖啡种类/单品咖啡: Espresso(意大利浓咖啡)、ShortBlack、Decaf(无因咖啡)、LongBlack(美式咖啡) 2)

    2024年02月06日
    浏览(14)
  • 设计模式(3)装饰模式

    设计模式(3)装饰模式

    一、介绍: 1、应用场景:把所需的功能按正确的顺序串联起来进行控制。动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。 当需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充时。例如,该类被隐藏或者该类是

    2024年02月13日
    浏览(12)
  • 设计模式——装饰器模式

    设计模式——装饰器模式

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 装饰器模式通过将对象包装在装饰器类中,以便动态地修改其行为。 这种模式创建了一个装饰类,用来包装原有的

    2024年02月10日
    浏览(10)
  • 【设计模式】装饰器模式

    【设计模式】装饰器模式

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 装饰器模式通过将对象包装在装饰器类中,以便动态地修改其行为。 这种模式创建了一个装饰类,用来包装原有的

    2024年02月13日
    浏览(12)
  • 【设计模式】-装饰器模式

    在软件开发中,经常有需求对已有的对象进行功能的扩展,但是传统的继承方式会导致类的数量快速增多,且难以维护。为了解决这个问题,装饰器模式应运而生。 装饰器模式是一种结构型设计模式,它可以在运行时动态地将新的行为附加到对象上,而不改变其结构。这种方

    2024年02月14日
    浏览(8)
  • 设计模式--装饰者模式

    设计模式--装饰者模式

    (1) 可乐种类/单品可乐 :BaiShiCola(百事可乐) FeiChangCola(非常可乐) CoCola(可口可乐) (2) 调料/附品: Milk  Chocolate (3) 要求在扩展新的可乐种类时 要具有良好的扩展性 改动方便 维护方便 (4) 使用OO的来就算不同之类可乐的费用 客户可以点单品可乐 也可以单品可乐+调料组合 方案1 

    2024年02月02日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包