> 五、装饰器模式 - Yuyy
Yuyy
Yuyy
五、装饰器模式

装饰器模式

定义

通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。

实现方式

http://bed.yuyy.info/IA.png

IA 需要增强的功能,对应的接口

public interface IA {
    void func();
}

A 待增强的类

public class A implements IA {
    @Override
    public void func() {

    }
}

ADecorator 装饰器,对功能增强

public class ADecorator implements IA {

    private IA ia;

    public ADecorator(IA ia) {
        this.ia = ia;
    }

    @Override
    public void func() {
        // 增强...
        ia.func();
        // 增强...
    }
}

JavaIO里如何使用的装饰器

http://bed.yuyy.info/LineNumberInputStream1.png

DataInputStream为什么继承FileInputStream,而不是直接组合InputStream?

为了让DataInputStream只重写InputStream中,自己关注的方法。

在FileInputStream中,对继承自InputStream的方法都重写了,并且内部调用的是组合的InputStream,而不是父类的方法。那为什么不直接用父类的方法呢?原因是组合的InputStream是外部传进来的,运用了多态,这个InputStream可能是其子类,包含额外对数据加工的操作。

为了达到此目的,需要对InputStream的所有方法进行重写,这部分重复的工作就交给了FileInputStream。

优点

  • 你无需创建新子类即可扩展对象的行为。
  • 你可以在运行时添加或删除对象的功能。
  • 你可以用多个装饰封装对象来组合几种行为。
  • 单一职责原则。 你可以将实现了许多不同行为的一个大类拆分为多个较小的类。

缺点

  • 在封装器栈中删除特定封装器比较困难。
  • 实现行为不受装饰栈顺序影响的装饰比较困难。
  • 各层的初始化配置代码看上去可能会很

与其他模式的关系

代理模式

两者代码结构类似,但应用场景不同。装饰者模式是对原有功能增强,例如原功能是读取字符串,增强后可缓存的读取字符串。而代理模式增强的是和原功能无关的功能,例如对API接口增强,可记录接口调用时间,参数等。

发表评论

textsms
account_circle
email

Yuyy

五、装饰器模式
装饰器模式 定义 通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 实现方式 IA 需要增强的功能,对应的接口 public interface IA { void func(); } A 待增…
扫描二维码继续阅读
2021-08-30
友情链接
标签
归档
近期文章
分类
近期文章