掌握Java设计模式之装饰设计模式(7)

原创
2018/04/18 21:21
阅读数 330

      装饰器的作用是使得被装饰者功能更强大,而且装饰前后的使用方式不变。Java I/O类库中有许多不同的功能组合情况,这些不同的功能组合都是使用装饰器模式实现的。

1、抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
2、具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。
3、装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。
4、具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的责任。

1、应用场景

    Io流,抽象构建,InputStream,如图

      那么它的具体构建 FileInputStram,如图

      为了增加一些额外的功能,需要用到装饰类,FilterInputStream,如图,怎么知道它是装饰类呢,你看代码里,protected volatile InputStram in,这个是所有装饰类的一个共同特点

具体抽象角色 BufferedInputStram:如图

      很明显它的抽象具体角色和具体构建类是不同的,他们之间的那个抽象类不管是implements 或者extends也好,但是共同点必须是把要抽象的构建类作为装饰类的对象。

代码实现

      2.1 抽象组件

public interface Car {

    void name();
}

      2.2具体抽象组件

public class MCar implements Car {
    @Override
    public void name() {

    }
}

      2.3 装饰组件,这个所有装饰类一个共同点,引入抽象组件进来

public class DecoratorCar implements Car {
    
    private Car car;

    public DecoratorCar(Car car){
        this.car = car;
    }

    @Override
    public void name() {
       car.name();
    }
}

      2.4 具体装饰

public class MyDecoratorCar extends DecoratorCar {

    public MyDecoratorCar(Car car) {
        super(car);
    }

    public void say(){
        System.out.println("扩展功能");
    }
    
    @Override
    public void name() {
        super.name();
        say();
    }
}

      main函数执行

public class Main {

   public static void main(String[] args){

       Car car = new MCar();
       car.name();

       MyDecoratorCar myDecoratorCar =  new MyDecoratorCar(car);

       myDecoratorCar.say();
   }
}

总结

1、关键点在装饰类! 它引入了最初始的类,这就是装饰类!

2、不要因为有些博客代码中又用到了多少extends 就有一些茫然,其实装饰设计模式跟这个没有关系,重点就在装饰类。
如图,记住这个核心的写法。

    从不影响原使类,只在具体子类添加对应的扩展功能。

 

展开阅读全文
打赏
1
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部