Java 設(shè)計(jì)模式學(xué)習(xí)--裝飾器模型

其實(shí)無論是代理模式還是裝飾模式,本質(zhì)上就是對(duì)原有對(duì)象增強(qiáng)的方式~
對(duì)象增強(qiáng)方式有下面幾種方式

  • 繼 承

  • 繼承父類,子類擴(kuò)展

  • 裝飾器模式

  • 使用“包裝”的方式來增強(qiáng)對(duì)象

  • 代理模式

裝飾器模式

就是動(dòng)態(tài)拓展原有類的功能,加強(qiáng)原有類的功能,就比如手機(jī),把手機(jī)當(dāng)成一個(gè)類,原有的手機(jī)只能打電話,現(xiàn)在增強(qiáng)這個(gè)類的功能,可以看美女直播,玩游戲,買東西。。。就是增強(qiáng)了這個(gè)類的功能

設(shè)計(jì)狗的接口,以一只狗 狗蛋為例子

public interface Dog {
    void eat();
}

實(shí)現(xiàn)狗的接口,很久很久以前有一只狗叫做狗蛋,就會(huì)吃吃吃 和找隔壁的花花。。這兩種技能

public class WhildDog implements Dog {

    @Override
    public void eat() {
        System.out.println("原來的狗蛋就會(huì)天天吃吃吃吃吃。。。。");
    }

    @Override
    public void findWomenDo() {
        System.out.println("原來的狗蛋就會(huì)天天吃吃吃吃吃,吃完找隔離的小母狗花花。。。然后 羞羞羞羞");
    }
}

抽象類--裝飾器

//抽象類  裝飾器 實(shí)現(xiàn)接口
public abstract class DecorateDog implements Dog {

    private Dog dog;
    //構(gòu)造函數(shù) 實(shí)現(xiàn)狗的接口
    public DecorateDog(Dog dog){
        this.dog=dog;
    }

    //實(shí)現(xiàn)狗吃東西接口
    @Override
    public void eat(){
        dog.eat();
    }

    @Override
    public void findWomenDo(){
        dog.findWomenDo();
    }
}

開始給狗蛋加技能了,先是看門的技能,繼承裝飾器的抽象類,然后添加看門技能的方法,吃完東西學(xué)會(huì)看門了狗蛋

//繼承裝飾器的抽象類
public class GuardHouse extends  DecorateDog {

    public GuardHouse(Dog dog) {
        super(dog);
    }

    //拓展功能
    public void biteBadPerson(){
        System.out.println("后來的狗蛋學(xué)會(huì)了看門....");
    }

    @Override
    public void eat(){
       //調(diào)用父類的方法
       super.eat();
       //看門
       biteBadPerson();
    }

給狗蛋添加接飛碟的技能了,吃完東西,看門了,酒足飯飽之后玩飛碟啊,然后再去找花花 嘿嘿嘿

public class TaoHaoMaster extends DecorateDog {
    public TaoHaoMaster(Dog dog) {
        super(dog);
    }

    public void play(){
        System.out.println("吃完飯的狗蛋學(xué)會(huì)了玩飛碟,吸引隔離的花花");
    }

    @Override
    public void findWomenDo(){
        play();
        super.findWomenDo();
    }
}

執(zhí)行看看,狗蛋一天的生活,new GuardHouse(dog) 新增了看門技能,new TaoHaoMaster(dog) 新增了接飛碟的技能,這兩種技能對(duì)狗蛋進(jìn)行了裝飾,讓狗蛋更加高大上了

    public static void main(String [] args){
            Dog dog=new WhildDog();
            dog=new GuardHouse(dog);
            dog=new TaoHaoMaster(dog);
            dog.eat();
            dog.findWomenDo();
image.png

其實(shí)下面這樣簡(jiǎn)寫就行,跟你經(jīng)常玩的IO流系不系很像,啊哈IO就是用的裝飾器模式嘛

        Dog dog=new TaoHaoMaster(new GuardHouse(new WhildDog()));
        dog.eat();
        dog.findWomenDo();

//上面這玩意跟玩IO流的時(shí)候是不是很像
 InputStream inputStream=
new BufferedInputStream(new FileInputStream(new File("C://狗蛋.jpg")));

參考了
https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247484226&idx=1&sn=a354d872978fc5db79a012c27ab5277f&chksm=ebd74243dca0cb5515fcad1ecfeda6a329be38c30a82a1325a5a19e7f62b0fa3c74069eed24d&scene=21#wechat_redirect

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

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

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