裝飾模式
首先裝飾模式不是代碼,是一種編寫邏輯思想。
適合場景:一個人點餐。碗筷必需品,其他的都可以隨意添加。
他方理解:裝飾模式指的是在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。
我的理解:保存最基礎的功能,其他類做出對應補充
具體例子:
- 創建一個超類,所有的類都繼承或實現。可以定義成接口類型
package com.dawn.design.decorate;
/**
* @Auther: dawn
* @Date: 2020/1/13 11:02
* @Description: 超類 吃
*/
public abstract class Eat {
protected void pre() {}
protected void after(){}
}
- 基礎類 和超類進行綁定關係
package com.dawn.design.decorate;
/**
* @Auther: dawn
* @Date: 2020/1/13 11:08
* @Description:
*/
public class BaseEat extends Eat {
@Override
protected void pre() {
System.out.println("第一準備碗筷");
}
@Override
protected void after() {
System.out.println("運動員正在玩");
}
}
- 最終應用類
package com.dawn.design.decorate;
/**
* @Auther: dawn
* @Date: 2020/1/13 11:10
* @Description: 籃球運動員
*/
public class FatterEat extends Eat{
Eat eat ;
public FatterEat(Eat eat) {
this.eat = eat;
}
@Override
protected void pre() {
eat.pre();
doSomething();
}
@Override
protected void after() {
eat.after();
}
void doSomething(){
System.out.println("胖的,想先吃兩個熱狗先");
}
}
package com.dawn.design.decorate;
/**
* @Auther: dawn
* @Date: 2020/1/13 11:25
* @Description:
*/
public class ThinEat extends Eat {
Eat eat;
public ThinEat(Eat eat) {
this.eat = eat;
}
@Override
protected void pre() {
eat.pre();
thinDoing();
}
@Override
protected void after() {
eat.after();
}
void thinDoing(){
System.out.println("苗條的人 想安靜的等待別人點單");
}
}
- 測試類
package com.dawn.design.decorate;
/**
* @Auther: dawn
* @Date: 2020/1/13 11:12
* @Description:
*/
public class TestEat {
public static void main(String[] args) {
/**
* 第一準備碗筷
* 胖的,想先吃兩個熱狗先
*/
Eat eat = new FatterEat(new BaseEat());
eat.pre();
/**
* 第一準備碗筷
* 苗條的人 想安靜的等待別人點單
*/
Eat e = new ThinEat(new BaseEat());
e.pre();
/**
* 第一準備碗筷
* 胖的,想先吃兩個熱狗先
* 苗條的人 想安靜的等待別人點單
*/
Eat e2 = new ThinEat(new FatterEat(new BaseEat()));
e2.pre();
}
}
總結
優點: 方便方法的擴展,不想extends增加代碼冗餘量。可以針對不同的個體創建不同的行爲數據
缺點: 每次使用會創建許多對象。過多的小類會讓我們的系統變得很複雜。對內存考驗極大。
結束語
裝飾器模式有利有弊(更多的是利大於弊),我們可以好好思考裝飾者模式應用場景,然後進一步掌握這種設計思想。