亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

裝飾者模式與其在Java API中的運(yùn)用

weapon / 1005人閱讀

摘要:基本原理通過使用裝飾者模式,可以在運(yùn)行時(shí)擴(kuò)充一個(gè)類的功能。裝飾者模式是類繼承的另外一種選擇。相反,裝飾者模式是面向運(yùn)行時(shí)候的對(duì)象實(shí)例的這樣就可以在運(yùn)行時(shí)根據(jù)需要進(jìn)行組合。一個(gè)裝飾者模式的示例是里的的實(shí)現(xiàn)。

一、裝飾者模式簡(jiǎn)介

裝飾者模式,是面向?qū)ο缶幊填I(lǐng)域中,一種動(dòng)態(tài)地往一個(gè)類中添加新的行為的設(shè)計(jì)模式。就功能而言,裝飾者模式相比生成子類更為靈活,這樣可以給某個(gè)對(duì)象而不是整個(gè)類添加一些功能。

1.基本原理

通過使用裝飾者模式,可以在運(yùn)行時(shí)擴(kuò)充一個(gè)類的功能。原理是:增加一個(gè)裝飾類包裹原來的類,包裹的方式一般是通過在將原來的對(duì)象作為修飾類的構(gòu)造函數(shù)的參數(shù)。裝飾類實(shí)現(xiàn)新的功能,但是,在不需要用到新功能的地方,它可以直接調(diào)用原來的類中的方法。裝飾類必須和原來的類有相同的接口。

裝飾者模式是類繼承的另外一種選擇。類繼承在編譯時(shí)候增加行為,而裝飾者模式是在運(yùn)行時(shí)增加行為。

當(dāng)有幾個(gè)相互獨(dú)立的功能需要擴(kuò)充時(shí),這個(gè)區(qū)別就變得很重要。在有些面向?qū)ο蟮木幊陶Z言中,類不能在運(yùn)行時(shí)被創(chuàng)建,通常在設(shè)計(jì)的時(shí)候也不能預(yù)測(cè)到有哪幾種功能組合。這就意味著要為每一種組合創(chuàng)建一個(gè)新類。相反,裝飾者模式是面向運(yùn)行時(shí)候的對(duì)象實(shí)例的,這樣就可以在運(yùn)行時(shí)根據(jù)需要進(jìn)行組合。一個(gè)裝飾者模式的示例是JAVA里的Java I/O Streams的實(shí)現(xiàn)。

裝飾者模式的UML類圖:

2.示例代碼

砂鍋羊肉面 為實(shí)例,別問為什么,(╯°□°)╯︵┻━┻

Component相當(dāng)于Marmite(砂鍋)類:

public abstract class Marmite {
    String description = "砂鍋";

    public String getDescription() {
        return description;
    }

    public abstract Integer cost();

    @Override
    public String toString() {
        return "這是一碗:" + getDescription() + ",價(jià)格:" + cost() + "元";
    }
}

ConcreteComponent是NoddlesMarmite(砂鍋面條)類:

public class NoddlesMarmite extends Marmite {

    public NoddlesMarmite() {
        description = "砂鍋面條";
    }

    public Integer cost() {
        return 8;
    }
}

Decorator是MaterialDecorator

public abstract class MaterialDecorator extends Marmite {
    public abstract String getDescription();
}

ConcreteDecorator是MuttonMarmite:

public class MuttonMarmite extends MaterialDecorator {
    Marmite marmite;

    public MuttonMarmite(Marmite marmite) {
        this.marmite = marmite;
    }

    @Override
    public String getDescription() {
        return "羊肉、" + marmite.getDescription();
    }

    @Override
    public Integer cost() {
        return 5 + marmite.cost();
    }
}

這是測(cè)試代碼:

public class MarmiteTest {
    public static void main(String[] args) {
        Marmite marmiteNoddle = new NoddlesMarmite();
        System.out.println(marmiteNoddle.toString());
        Marmite muttonMarmiteNoddle = new MuttonMarmite(marmiteNoddle);
        System.out.println(muttonMarmiteNoddle.toString());
    }
}
二、Java API中裝飾者的運(yùn)用

先看一段demo

public class JavaDemo {
    public static void main(String[] args) {
        System.out.println("請(qǐng)輸入一句話:");
        BufferedInputStream bufferedInputStream = new BufferedInputStream(System.in);
        String msg = "wocao";
        try {
            BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(bufferedInputStream));
            msg = bufferedReader.readLine();
        } catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("輸入的是:" + msg);
    }
}

這段代碼的功能是將控制臺(tái)中輸入的內(nèi)容打印出來。

查看java api得知
BufferedInputStream繼承的是FilterInputStream,如下圖:

FilterInputStream繼承的是InputStream,并且有InputStream對(duì)象的一個(gè)引用

由此可以得出

InputStream相當(dāng)于Component,F(xiàn)ileterInputStream相當(dāng)于Decorator,BufferedInputStream相當(dāng)于ConcreteDecorator,System.in相當(dāng)于ConcreteComponent。

三、自己實(shí)現(xiàn)一個(gè)關(guān)于InputStream的ConcreteDecorator

talk is cheap, show me the code

public class LowerCaseInputStream extends FilterInputStream {

    public LowerCaseInputStream(InputStream in){
        super(in);
    }

    @Override
    public int read() throws IOException {
        int c=super.read();
        return (c==-1?c:Character.toLowerCase((char)c));
    }

    @Override
    public int read(byte[] b, int off, int len) throws IOException {
        int result=super.read(b,off,len);
        for(int i=off;i

不想解釋了,心累
看不懂的,送你一幅圖:

---------------------------------------EOF--------------------------------------

參考資料:

https://zh.wikipedia.org/wiki...

Head First設(shè)計(jì)模式

我的心愿是世界和平!~( ゜▽゜)つロ

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/66609.html

相關(guān)文章

  • 接口

    摘要:前言這一系列的文章將主要基于設(shè)計(jì)模式這本書的要點(diǎn)還有一些翻閱的博客文章借鑒來源會(huì)注明外加自己的一些與直覺不同于其他設(shè)計(jì)模式類的書設(shè)計(jì)模式是一本講述設(shè)計(jì)模式在動(dòng)態(tài)語言中的實(shí)現(xiàn)的書它從設(shè)計(jì)的角度教人編寫代碼書中的許多實(shí)例代碼來自實(shí)戰(zhàn)項(xiàng)目對(duì)面向?qū)? 前言 這一系列的文章將主要基于js設(shè)計(jì)模式這本書的要點(diǎn)還有一些翻閱的博客文章,借鑒來源會(huì)注明,外加自己的一些demo與直覺.不同于其他設(shè)計(jì)模式類的...

    zhjx922 評(píng)論0 收藏0
  • Java IO : 流,以及裝飾模式其上的運(yùn)用

    摘要:從應(yīng)用流向目的地稱為輸出流,從目的地流向應(yīng)用稱為輸入流。裝飾器模式裝飾器模式允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu)。以及家屬對(duì)于裝飾器模式的體現(xiàn),也以此類推。 流概述 Java中,流是一種有序的字節(jié)序列,可以有任意的長(zhǎng)度。從應(yīng)用流向目的地稱為輸出流,從目的地流向應(yīng)用稱為輸入流。 Java的流族譜 Java的java.io包中囊括了整個(gè)流的家族,輸出流和輸入流的譜系如下所示...

    fuyi501 評(píng)論0 收藏0
  • 一文理清21種設(shè)計(jì)模式:用實(shí)例分析和對(duì)比

    摘要:設(shè)計(jì)模式無論是對(duì)于最底層的的編碼實(shí)現(xiàn)還是較高層的架構(gòu)設(shè)計(jì)都有著重要的指導(dǎo)作用。所謂光說不練假把式,今天我就把項(xiàng)目中常見的應(yīng)用場(chǎng)景涉及到的主要設(shè)計(jì)模式及其相關(guān)設(shè)計(jì)模式總結(jié)一下,用實(shí)例分析和對(duì)比的方式在一片文章中就把最常見的種設(shè)計(jì)模式梳理清楚。 設(shè)計(jì)模式無論是對(duì)于最底層的的編碼實(shí)現(xiàn)還是較高層的架構(gòu)設(shè)計(jì)都有著重要的指導(dǎo)作用。所謂光說不練假把式,今天我就把項(xiàng)目中常見的應(yīng)用場(chǎng)景涉及到的主要設(shè)計(jì)模...

    PrototypeZ 評(píng)論0 收藏0
  • 開發(fā)之路(設(shè)計(jì)模式三:裝飾模式

    摘要:若要擴(kuò)展功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者模式意味著一群裝飾者類,這些類用來包裝具體組件。裝飾者類反映出被裝飾組件類型。裝飾者會(huì)導(dǎo)致設(shè)計(jì)中出現(xiàn)許多小對(duì)象,如果過度使用,會(huì)讓程序變得很復(fù)雜。 嘿嘿嘿,你是不是很喜歡用繼承呢?感覺沒什么事情是一個(gè)爸爸類搞不定的,有的話就兩個(gè),快來跟我看看這個(gè)模式吧,它能讓你斷奶,給愛用繼承的人一個(gè)全新的設(shè)計(jì)眼界。 直奔主題,你是否有聽說...

    Vicky 評(píng)論0 收藏0
  • 美顏相機(jī)中的設(shè)計(jì)模式 —— 裝飾模式

    摘要:這是設(shè)計(jì)模式系列的第二篇,系列文章目錄如下用一句話總結(jié)那些殊途同歸的設(shè)計(jì)模式工廠策略模版方法美顏相機(jī)中的設(shè)計(jì)模式裝飾者模式幾乎所有的設(shè)計(jì)模式都是通過增加一層抽象來解決問題。 這是設(shè)計(jì)模式系列的第二篇,系列文章目錄如下: 用一句話總結(jié)那些殊途同歸的設(shè)計(jì)模式:工廠=?策略=?模版方法 美顏相機(jī)中的設(shè)計(jì)模式——裝飾者模式 幾乎所有的設(shè)計(jì)模式都是通過增加一層抽象來解決問題。 上一篇中提...

    anonymoussf 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<