装饰者模式(转载)

转载自: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,并没有改变其内核

  使用场合:
    如果需要再不影响其他对象的情况性增长。下,以动态、透明的方式给对象增加职责,可以使用装饰者模式。     

如果不适合使用子类进行扩展的时候,可以考虑使用装饰者模式。装饰者模式使用的是对象组合的方式。 不适合子类扩展:比如扩展功能需要的子类太多,造成子类数量呈爆炸

猜你喜欢

转载自blog.csdn.net/xingyuncaojun/article/details/87272888
今日推荐