转载自:https://www.cnblogs.com/lewis0077/p/6174374.html
装饰者模式:
给一类对象增加新的功能,装饰方法与具体的内部逻辑无关。
动态给对象增加功能,从一个对象的外部给对象添加功能,相当于改变了对象的外观,比用继承的方式更加的灵活。当使用装饰后,从外部系统的角度看,就不再是原来的那个对象了,而是使用一系列的装饰器装饰过后的对象。
例如:把用户输入的一段文字,进行加密,反转,大写,小写,等操作就是装饰。
装饰者模式在jdk中的应用I/O:
InputStream 相当于装饰者模式的Component
FileInputStream,ByteArrayInputStream,ObjectInputStream这些对象直接继承了InputStream,相当于装饰者模式中的ConcreteComponent
FilterInputStream 继承了InputStream,并且持有了一个InputStream ,相当于装饰者模式中的Decorator
BufferedInputStream,PushbackInputStream,LineNumberInputStream,DataInputStream继承了FilterInputStream,相当于装饰者模式中的ConcreteDecorator
优点、缺点,使用场合
优点:
1.比继承更灵活
从为对象添加功能的角度来看,装饰者模式比继承更为灵活。继承是静态的,一旦继承,所有的子类都有一样的功能。装饰者模式采用把功能分离到每个装饰器当中,
通过对象组合的方式,在运行时动态的组合功能,被装饰对象最终由哪些功能,是由运行时动态组合的功能决定的。
2.复用功能更容易
装饰模式把一系列复杂的功能分散到每个装饰器中,一般情况下每个装饰器只实现一个功能,使得实现装饰器变得简单,有利于装饰器功能的复用,可以给一个对象添加
多个装饰器,也可以把一个装饰器装饰多个对象,从而实现复用装饰器的功能。
3.简化高层定义
装饰者模式可以通过组合装饰器的方式,为对象添加任意多的功能;因此在高层定义的时候,不必把所有的功能都定义处理,只需要定义最基本的就可以了,在需要的时候可以通过组合装饰器的方式来完成所需的功能。
缺点:会产生较多的细粒度的对象
装饰模式把一系列复杂的功能分散到每个装饰器中,一般情况下每个装饰器只实现一个功能,这样会产生很多细粒度的对象,并且功能越复杂,细粒度对象越多。
本质:动态组合
注意:装饰者模式只是改变组件对象的外观Facde,并没有改变其内核
使用场合:
如果需要再不影响其他对象的情况性增长。下,以动态、透明的方式给对象增加职责,可以使用装饰者模式。
如果不适合使用子类进行扩展的时候,可以考虑使用装饰者模式。装饰者模式使用的是对象组合的方式。 不适合子类扩展:比如扩展功能需要的子类太多,造成子类数量呈爆炸