装饰器模式,是一种继承的替代解决方案。原本的父类为被装饰者,子类为装饰后的结果:
顶级接口Animal包含一个展示自身行为的方法:
public interface Animal {
void show();
}
具有共有行为的具体的实现类,RunAnimal:
public class RunAnimal implements Animal{
public void run() {
System.out.println("run-->>>");
}
@Override
public void show() {
this.run();
}
}
装饰者类:DecorateAnimal,也实现Animal接口,并拥有一个Animal的引用:
public abstract class DecorateAnimal implements Animal{
private Animal animal;
public DecorateAnimal(Animal animal) {
super();
this.setAnimal(animal);
}
public abstract void show();
public Animal getAnimal() {
return animal;
}
public void setAnimal(Animal animal) {
this.animal = animal;
}
}
其它的动物要增加除Run的行为,需要继承装饰者DecorateAnimal再增加行为,如小鸟增加飞的行为:
public class BirdAnimal extends DecorateAnimal{
public BirdAnimal(Animal animal) {
super(animal);
}
public void fly() {
System.out.println("fly--->>>>");
}
public void show() {
getAnimal().show();
this.fly();
}
}
这个时候我们要让小鸟即有fly和run的行为,继承的方式下,我们只需继承RunAnimal再增加行为,而装饰器模式下则是:
public class MainClass {
public static void main(String[] args) {
Animal animal=new RunAnimal();
BirdAnimal birdAnimal = new BirdAnimal(animal);
birdAnimal.show();
}
}
输出结果:
run-->>>
fly--->>>>
当鸭子DuckAnimal要有run,fly,swim的行为时,继承的方式则是,DuckAnimal继承BirdAnimal继承RunAnimal.而装饰器模式下,DuckAnimal还是依旧继承DecorateAnimal,再DuckAnimal中添加swim的行为即可:
public class DuckAnimal extends DecorateAnimal{
public DuckAnimal(Animal animal) {
super(animal);
}
public void swim() {
System.out.println("swim-->>");
}
@Override
public void show() {
getAnimal().show();
this.swim();
}
}
然后调用:
public class MainClass {
public static void main(String[] args) {
Animal animal=new RunAnimal();
//先装饰RunAnimal的行为
BirdAnimal birdAnimal = new BirdAnimal(animal);
//再装饰BirdAnimal的行为
DuckAnimal duckAnimal=new DuckAnimal(birdAnimal);
duckAnimal.show();
}
}
结果为:
run-->>>
fly--->>>>
swim-->>