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(); }
吃饭前洗手 狗吃肉 我的狗狗还能打怪兽
至此我们的装饰者模式就搞定了,是不是很简单,以后遇到增强功能的需求时可以想一想装饰者模式
来源:https://www.cnblogs.com/Howlet/p/12020604.html