Java设计模式之装饰器模式

2019-07-14  本文已影响0人  singlezero

Java设计模式之装饰器模式

本文仅是个人观点,如有错误请指正

简介

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。

代码实现

最近小王很烦恼,因为公司来了新的业务交给他,客户是一个咖啡馆,需要为他们设计一套点餐系统,他们具有商品咖啡,饮品,还有配料,这些各种组合起来就是各种咖啡品类,这些各种各样的组合下来小王一支找不到头绪,思前想后还是找到了公司里的大牛老李(咋又是老李),老李一听需求,脱口而出,这不就是装饰器模式么,小王听了一愣,啊,那应该怎么设计呢,老李说,咱们设计一抽象类里面放入单品的名字、计数、总价计算,然后分别设计咖啡基类、果汁类、调料类,然后各种咖啡果汁基于这些类进行扩展。。。。,小王听着云里雾里,老李一看说这个简单,我来说你来写代码。

看到结果,小王一脸崇拜的看着老李,老李脑袋在灯光下冉冉发光,形象无比的高大。。。。

扩展

其实java内置的IO对象里面也使用到了装饰器模式,下面代码就是我们用来测试的

public class UpperCaseInputStream extends FilterInputStream {

    protected UpperCaseInputStream(InputStream in) {
        super(in);
    }

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

    @Override
    public int read(byte[] b, int offset, int len) throws IOException {
        int result = super.read(b, offset, len);
        for (int i = 0; i < result; i++) {
            b[i] = (byte) Character.toUpperCase((char) (b[i]));
        }
        return result;
    }
}
 /* @author  Jonathan Payne
 * @since   JDK1.0
 */
public
class FilterInputStream extends InputStream {....}

总结

一般的情况下我们为了扩展一个子类,经常使用装饰者模式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀所以在不想增加很多子类的情况下我们可以考虑使用装饰器模式,其中装饰类和被装饰类可以独立发展,不会互相耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

链接

本文代码仓库地址:https://gitee.com/singlekingdom/JavaDesignPatterns.git
上一篇下一篇

猜你喜欢

热点阅读