美文网首页
装饰模式

装饰模式

作者: Mark_ZSQ | 来源:发表于2019-11-10 16:41 被阅读0次

    什么是装饰模式?

    装饰器模式,也成为包装模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能。其结构图如下:


    1321.png

    Component为统一接口,也是装饰类和被装饰类的基本类型。

    ConcreteComponent为具体实现类,也是被装饰类,他本身是个具有一些功能的完整的类。

    Decorator是装饰类,实现了Component接口的同时还在内部维护了一个ConcreteComponent的实例,并可以通过构造函数初始化。而Decorator本身,通常采用默认实现,他的存在仅仅是一个声明:我要生产出一些用于装饰的子类了。而其子类才是赋有具体装饰效果的装饰产品类。

    ConcreteDecorator是具体的装饰产品类,每一种装饰产品都具有特定的装饰效果。可以通过构造器声明装饰哪种类型的ConcreteComponent,从而对其进行装饰。

    装饰模式案例

    //房屋基础接口
    public interface House {
         void run();
    }
    //房屋装饰类
    public class HouseDecorate implements House {
       private House house;
       public HouseDecorate(House house){
          this.house=house;
       }
        @Override
        public void run() {
            house.run();
        }
    
    }
    public class HouseDecorateImpl extends HouseDecorate {
    
        public HouseDecorateImpl(House house) {
            super(house);
    
        }
    @Override
        public void run() {
            super.run();
            System.out.println("贴上墙纸..");
        }
    
    }
    //客户端调用
    public class ClientTest {
    
        public static void main(String[] args) {
            HouseImpl houseImpl = new HouseImpl();
            houseImpl.run();
            System.out.println("###新增贴上墙纸..###");
            HouseDecorate houseDecorate = new HouseDecorateImpl(houseImpl);
            houseDecorate.run();
        }
    
    }
    
    

    装饰与代理区别

    装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话 说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。

    装饰模式应用场景

    • 在IO中,具体构件角色是节点流,装饰角色是过滤流。
    • FilterInputStream和FilterOutputStream是装饰角色,而其他派生自它们的类则是具体装饰角色。
    • DataoutputStream out=new DataoutputStream(new FileoutputStream());
      这就是 装饰者模式,DataoutputStream是装饰者子类,FileoutputStream是实现接口的子类。
    • 这里不会调用到装饰者类--FilteroutputStream,只是作为继承的另一种方案,对客户端来说是透明的,是为了功能的扩张.

    相关文章

      网友评论

          本文标题:装饰模式

          本文链接:https://www.haomeiwen.com/subject/pmsabctx.html