调用者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();
}
}
:在不改变原有类的条件下 动态的扩展(包装)原有类,给它增加方法和属性,或者也可以重写(遮蔽)原有的功能。
开闭原则:类、模块等应对扩展开放,对修改封闭。