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();
}
吃飯前洗手
狗吃肉
我的狗狗還能打怪獸
至此我們的裝飾者模式就搞定了,是不是很簡單,以后遇到增強功能的需求時可以想一想裝飾者模式