裝飾器模式

裝飾器模式

裝飾器模式中主要有兩個角色:

  • 裝飾器;
  • 被裝飾的對象。
    用老王買裝備的例子來說,老王就是被裝飾的對象,而衣服、褲子、帽子等就是裝飾器。

裝飾器和被裝飾的對象有兩個特點,也是裝飾器模式的關(guān)鍵:

  • 他們實現(xiàn)同一個接口;
  • 裝飾器中使用了被裝飾的對象。

使用裝飾器模式的幾個關(guān)鍵點:

  • 裝飾器和被裝飾類要實現(xiàn)同一個接口( 實際開發(fā)中也可能用繼承 )。
  • 裝飾器中的方法可以調(diào)用被裝飾對象提供的方法,以此實現(xiàn)功能累加的效果,例如,夾克裝飾器和帽子裝飾器中調(diào)用了 person.cost() + xx 實現(xiàn)累計消費金額的累加。

實例

public interface Person {
    /**
     * 計算累計消費
     * @return
     */
    public Double cost();
    public void show();
}
/**
 * 抽象的服飾裝飾器
 */
public abstract class ClothesDecorator implements Person {
    //裝飾器中要使用被裝飾器的對象,構(gòu)造方法中傳入
    protected Person person;

    public ClothesDecorator(Person person) {
        this.person = person;
    }
}
/**
 * 被裝飾的對象
 */
public class LaoWang implements Person{

    @Override
    public Double cost() {
        return 0.0; //赤果果的時候累計消費為0
    }

    @Override
    public void show() {
        System.out.println("我是赤果果的老王");
    }
}
public class Jacket extends ClothesDecorator {
    public Jacket(Person person) {
        super(person);
    }

    @Override
    public void show() {
        person.show();
        System.out.println("穿上夾克,累計消費" + this.cost());
    }

    @Override
    public Double cost() {
        return person.cost() + 100; //夾克100元
    }
}
public class Hat extends ClothesDecorator {
    public Hat(Person person) {
        super(person);
    }

    @Override
    public void show() {
        //執(zhí)行已有功能
        person.show();
        //此處是附加的功能
        System.out.println("戴上帽子,累計消費" + this.cost());
    }

    @Override
    public Double cost() {
        return person.cost() + 50; //帽子50元
    }
}

單元測試:

import com.netease.learn.designPattern.decorator.Hat;
import com.netease.learn.designPattern.decorator.Jacket;
import com.netease.learn.designPattern.decorator.LaoWang;
import com.netease.learn.designPattern.decorator.Person;
import org.junit.Test;

public class DecoratorTest {

    @Test
    public void test1() {
        Person laowang = new LaoWang();

        //穿上夾克
        laowang = new Jacket(laowang);

        //戴上帽子
        laowang = new Hat(laowang);

        laowang.show();
        System.out.println("買單,老王總共消費:" + laowang.cost());
    }
}

參考資料

  1. 代碼倉庫-裝飾器模式
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 8.門面模式 8.1.課程目標(biāo) 1、掌握門面模式和裝飾器模式的特征和應(yīng)用場景 2、理解裝飾器模式和代理模式的根本區(qū)...
    我是阿喵醬閱讀 996評論 0 1
  • 1.初識裝飾模式 動態(tài)地給一個對象添加一些額外的職責(zé)。就增加功能來說,裝飾模式比生成子類更為靈活。 Compone...
    王偵閱讀 799評論 0 0
  • 定義 裝飾器模式又名包裝(Wrapper)模式。裝飾器模式以對客戶端透明的方式拓展對象的功能,是繼承關(guān)系的一種替代...
    步積閱讀 36,624評論 0 38
  • 裝飾器模式 裝飾器模式是一種旨在提升代碼復(fù)用率的結(jié)構(gòu)性模式。有點類似于混入模式,它被認(rèn)為是一種可以替代子類的可行方...
    pws019閱讀 409評論 0 0
  • 在前面相信大家對組合模式已經(jīng)有了一定的了解,現(xiàn)在我們來繼續(xù)講一下裝飾器模式。 什么是裝飾器模式 裝飾模式是通過組合...
    ManyHong閱讀 511評論 0 1

友情鏈接更多精彩內(nèi)容