设计模式学习之三装饰器模式

2021-01-08

调用者A

实际被调用者B

包装类C

原来在A中直接构造B,直接调用B的方法。现在在A中构造C,C中再构造、调用B的方法。

整个流程就相当于C包装了B,可以在调用到B的方法前后进行某些处理。

 

 

package com.animal;

public interface Animal {
    void bark();
    //动物接口 可以有 具体的 多种,如猫,狗,鸡
}

 

package com.animal;

public class Dog implements Animal{
    @Override
    public void bark(){
        System.out.println("dog:bark");
    }
}

 

package com.animal;

public class Cat implements Animal{
    @Override
    public void bark(){
        System.out.println("cat:bark");
    }
}

 

package com.animal;

public class T {
    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();
        dog.bark();
        cat.bark();

        /*
            Dog 和 Cat都已经实现好了。如果想要扩展 他们的功能那就需要修改这两个类,但是如果不想修改它呢?
            :创建 一个 Animal装饰类
         */

        Animal dog2 = new AnimalDecrator(new Dog());
        dog2.bark();
        Animal cat2 = new AnimalDecrator(new Cat());
        cat2.bark();
    }
}


//

dog:bark
cat:bark
这个类是:com.animal.Dog  通过装饰器可以动态的给既有类增加功能和属性
dog:bark
这个类是:com.animal.Cat  通过装饰器可以动态的给既有类增加功能和属性
cat:bark

 

package com.animal;

public class AnimalDecrator implements Animal{
    private Animal primitiveAnimal;

    public AnimalDecrator(Animal primitiveAnimal){
        this.primitiveAnimal = primitiveAnimal;
    }

    @Override
    public void bark() {
        System.out.println("这个类是:"+primitiveAnimal.getClass().getCanonicalName()+"  通过装饰器可以动态的给既有类增加功能和属性");
        this.primitiveAnimal.bark();
    }
}

 

:在不改变原有类的条件下 动态的扩展(包装)原有类,给它增加方法和属性,或者也可以重写(遮蔽)原有的功能。

开闭原则:类、模块等应对扩展开放,对修改封闭。