装饰者模式
1. 装饰者模式(Decorator Pattern)
定义
在不改变原代码结构的情况下,动态地扩展一个对象的功能,相比继承有更灵活的实现方式。见名知意,其就是在需要增强功能的对象上包装一层代码,达到增强功能的效果
作用
装饰者模式在对象创建好之后才动态给对象增加功能,也可以选择不增加,自由灵活。而继承是在对象创建时就已经确定,继承如果要扩展功能,因为单继承原因需要多重继承,会显得麻烦臃肿
2. 实现
准备
一条汪的接口
public interface Dog {
abstract void eat();
}
某汪的实现类
public class MyDog implements Dog {
public void eat() {
System.out.println("狗吃肉");
}
}
下面我们使用装饰者模式给狗狗增加功能
2.1 首先得有装饰器
//实现Dog接口
public abstract class DogDecorator implements Dog {
private Dog dog;
//用构造方法来获取需要增强功能的狗狗
public DogDecorator(Dog dog) {
this.dog = dog;
}
//调用父类狗狗的功能
public void eat() {
dog.eat();
}
}
2.2 用装饰器来增强功能
我们想狗狗在吃饭前洗手,需要增加洗手的功能
//继承装饰类
public class WashHandDog extends DogDecorator {
public WashHandDog(Dog dog) {
super(dog);
}
//需要增强的功能
public void WashHand(){
System.out.println("吃饭前洗手");
}
//重写方法
public void eat(){
WashHand();
super.eat();
}
}
现在还想狗狗吃完饭能去打怪兽
public class BeatMonster extends DogDecorator {
public BeatMonster(Dog dog) {
super(dog);
}
public void BeatMonster(){
System.out.println("我的狗狗还能打小怪兽");
}
public void eat(){
super.eat();
BeatMonster();
}
}
2.3 升级版狗狗出现
public static void main(String[] args) {
Dog mydog = new MyDog();
mydog = new WashHandDog(mydog);
mydog = new BeatMonster(mydog);
mydog.eat();
}
吃饭前洗手
狗吃肉
我的狗狗还能打怪兽
至此我们的装饰者模式就搞定了,是不是很简单,以后遇到增强功能的需求时可以想一想装饰者模式