国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

設計模式——裝飾器模式(Decorator Pattern)+ Spring相關源碼

這篇具有很好參考價值的文章主要介紹了設計模式——裝飾器模式(Decorator Pattern)+ Spring相關源碼。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、裝飾器模式的定義

  • 別名:包裝模式(Wrapper Pattern)
  • 類型:結構型模式。
  • 目的:指在不改變現(xiàn)有對象結構的情況下,動態(tài)地給該對象增加一些職責額外功能。

二、個人理解

給對象添加新功能時,并不是在對象類中直接添加,而是在裝飾器類中添加。
在裝飾類中添加新功能,你可以增強原先對象的方法,也可以給對象新增一個方法。

舉個抽象的例(可能并不是很貼切)

假設要給人類添加開炮功能。
但由于這是人類,咱們不能通過繼承直接給人類添加開炮功能;
所以我們就得通過組合,將機器和人類組合起來、通過變相實現(xiàn)人類可以開炮。
這個機器就是裝飾器。

  • 坦克 + 人類 ,實現(xiàn)開炮功能
  • 高達 + 人類 ,實現(xiàn)開炮功能

三、例子

1、菜鳥教程例子

菜鳥教程的例子都將對象和裝飾器進行了抽象處理,實現(xiàn)了可替換對象和裝飾器的實現(xiàn)類。
菜鳥教程原例子
個人覺得這樣理解裝飾器太繞了,下面的例子就只保留了對象和裝飾器。

1.1、定義對象

定義一個圓的對象

public class Circle{
   @Override
   public void draw() {
      System.out.println("Shape: Circle");
   }
}

1.2、定義裝飾器

新增setRedBorder方法去設置紅色邊框。

public class RedCircleDecorator{
   private Circle c;
   public RedCircleDecorator(Circle c) {
      this.c = c;
   }
 
   @Override
   public void draw() {
      decoratedShape.draw();         
      setRedBorder(decoratedShape);
   }
 
   private void setRedBorder(Circle decoratedShape){
      System.out.println("Border Color: Red");
   }
}

但我覺這個菜鳥這個例子并不能把裝飾器模式特點表現(xiàn)出來。
因setRedBorder是私有,并且只是把原先draw方法進行了增強。
這樣的話,代理模式也能實現(xiàn),代理模式也能增強原有的方法,所以這里并不能把裝飾器模式特點表現(xiàn)出來。
所以我改了一下。

public class ColorCircleDecorator{
   private Circle c;
   public RedCircleDecorator(Circle c) {
      this.c = c;
   }
 
   @Override
   public void draw() {
      decoratedShape.draw();
      System.out.println("畫了個普通的圓");         
   }
 
   public void drawRedCircle(Circle decoratedShape){
   	  decoratedShape.draw();
      System.out.println("畫了個紅色的圓");
   }
   public void drawBlueCircle(Circle decoratedShape){
      decoratedShape.draw();
      System.out.println("畫了個藍色的圓");
   }
}

這個例子保留了原先的draw功能,又新增了drawRedCircle和drawBlueCircle功能。

3、JDK源碼 ——包裝類

包裝類也運用了裝飾器模式。
將基本類型 轉 包裝類 的同時,還提供各種轉換類型的功能。

4、JDK源碼 —— IO、OutputStreamWriter

OutputStreamWriter同時運用了裝飾器模式+適配器模式。
這里我們拿裝飾器部分來講。

FileOutputStream fos = new FileOutputStream(new File("Y:/學習資料.md"));
OutputStreamWriter osw = new OutputStreamWriter(fos);
osw.append("新資料xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

原本FileOutputStream 是原本沒有append功能的,
而在中OutputStreamWriter 添加append功能。
源碼:

public class OutputStreamWriter extends Writer {
	private final StreamEncoder se;
	
	public OutputStreamWriter(OutputStream out) {
        super(out);
        se = StreamEncoder.forOutputStreamWriter(out, lockFor(this),
                out instanceof PrintStream ps ? ps.charset() : Charset.defaultCharset());
    }
    @Override
    public Writer append(CharSequence csq) throws IOException {
        if (csq instanceof CharBuffer) {
            se.write((CharBuffer) csq);
        } else {
            se.write(String.valueOf(csq));
        }
        return this;
    }
}
 

可以看到雖然OutputStreamWriter 重寫了append方法。
但構造器里OutputStream又被新的裝飾器StreamEncoder接收。
而StreamEncoder類就已經通過繼承Writer 增加了append方法。

public final class StreamEncoder extends Writer {
	private final OutputStream out;
    private StreamEncoder(OutputStream out, Object lock, CharsetEncoder enc) {
        super(lock);
        this.out = out;
        this.ch = null;
        this.cs = enc.charset();
        this.encoder = enc;

        this.bb = ByteBuffer.allocate(INITIAL_BYTE_BUFFER_CAPACITY);
        this.maxBufferCapacity = MAX_BYTE_BUFFER_CAPACITY;
    }
	public static StreamEncoder forOutputStreamWriter(OutputStream out, Object lock, Charset cs) {
        return new StreamEncoder(out, lock, cs);
    }
}

5、Spring源碼 —— BeanWrapperImpl

BeanWrapperImpl類是對BeanWrapper接口的默認實現(xiàn),它包裝了一個bean對象,緩存了bean的內省結果,并可以訪問bean的屬性、設置bean的屬性值。

BeanWrapperImpl功能還挺復雜的,大家可以自行去看源碼,我就不貼出來了。

5、SpringMVC源碼 —— HttpHeadResponseDecorator

HttpHeadResponseDecorator 給ServerHttpResponse 添加了writeWith、writeAndFlushWith的功能。

public class HttpHeadResponseDecorator extends ServerHttpResponseDecorator {
    public HttpHeadResponseDecorator(ServerHttpResponse delegate) {
        super(delegate);
    }

    public final Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
        return this.shouldSetContentLength() && body instanceof Mono ? ((Mono)body).doOnSuccess((buffer) -> {
            if (buffer != null) {
                this.getHeaders().setContentLength((long)buffer.readableByteCount());
                DataBufferUtils.release(buffer);
            } else {
                this.getHeaders().setContentLength(0L);
            }

        }).then() : Flux.from(body).doOnNext(DataBufferUtils::release).then();
    }

    private boolean shouldSetContentLength() {
        return this.getHeaders().getFirst("Content-Length") == null && this.getHeaders().getFirst("Transfer-Encoding") == null;
    }

    public final Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<? extends DataBuffer>> body) {
        return this.setComplete();
    }
}


四、其他設計模式

創(chuàng)建型模式
結構型模式

  • 1、設計模式——裝飾器模式(Decorator Pattern)+ Spring相關源碼

行為型模式文章來源地址http://www.zghlxwxcb.cn/news/detail-737675.html

  • 1、設計模式——訪問者模式(Visitor Pattern)+ Spring相關源碼
  • 2、設計模式——中介者模式(Mediator Pattern)+ JDK相關源碼
  • 3、設計模式——策略模式(Strategy Pattern)+ Spring相關源碼
  • 4、設計模式——狀態(tài)模式(State Pattern)
  • 5、設計模式——命令模式(Command Pattern)+ Spring相關源碼
  • 6、設計模式——觀察者模式(Observer Pattern)+ Spring相關源碼
  • 7、設計模式——備忘錄模式(Memento Pattern)
  • 8、設計模式——模板方法模式(Template Pattern)+ Spring相關源碼
  • 9、設計模式——迭代器模式(Iterator Pattern)+ Spring相關源碼
  • 10、設計模式——責任鏈模式(Chain of Responsibility Pattern)+ Spring相關源碼
  • 11、設計模式——解釋器模式(Interpreter Pattern)+ Spring相關源碼

到了這里,關于設計模式——裝飾器模式(Decorator Pattern)+ Spring相關源碼的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 《golang設計模式》第二部分·結構型模式-04-裝飾器模式(Decorator)

    《golang設計模式》第二部分·結構型模式-04-裝飾器模式(Decorator)

    裝飾器(Decorator)通過包裝(不是繼承)的方式向目標對象中動態(tài)地添加或刪除功能。 Component(抽象組件):定義了原始對象的接口,裝飾器也會實現(xiàn)這個接口。 Concrete Component(具體組件):原始對象,以后裝飾器會裝飾它。 Decorator(抽象裝飾器):關聯(lián)/聚合了抽象組件,

    2024年02月09日
    瀏覽(23)
  • 設計模式——迭代器模式(Iterator Pattern)+ Spring相關源碼

    類型: 行為型模式 目的: 用于順序訪問集合對象的元素,使用者不需要知道集合對象的底層表示。 2.1.1 定義迭代器接口 2.1.2 定義迭代對象接口——用于返回一個迭代器 2.1.3 實現(xiàn) 迭代對象 和 迭代器 2.1.4 使用 迭代器CompositeIterator 創(chuàng)建型模式 結構型模式 1、設計模式——裝

    2024年02月05日
    瀏覽(29)
  • 設計模式——觀察者模式(Observer Pattern)+ Spring相關源碼

    類型:行為型模式 目的:當一個對象的狀態(tài)發(fā)生改變時,其所有依賴者(觀察者)都會收到通知并自動更新。 2.1.1 定義觀察者 2.1.2 定義被觀察對象 2.1.3 使用 2.2.1 觀察者接口Observer 2.2.1 被觀察者對象Observable 2.3.1 觀察者 2.3.2 被觀察者 創(chuàng)建型模式 結構型模式 1、設計模式——

    2024年02月06日
    瀏覽(24)
  • 【設計模式——學習筆記】23種設計模式——裝飾器模式Decorator(原理講解+應用場景介紹+案例介紹+Java代碼實現(xiàn))

    【設計模式——學習筆記】23種設計模式——裝飾器模式Decorator(原理講解+應用場景介紹+案例介紹+Java代碼實現(xiàn))

    在咖啡廳中,有多種不同類型的咖啡,客戶在預定了咖啡之后,還可以選擇添加不同的調料來調整咖啡的口味,當客戶點了咖啡添加了不同的調料,咖啡的價格需要做出相應的改變。 要求 :程序實現(xiàn)具有良好的拓展性、改動方便、維護方便 【方案一】 寫一個抽象類Drink,然

    2024年02月15日
    瀏覽(30)
  • 設計模式——責任鏈模式(Chain of Responsibility Pattern)+ Spring相關源碼

    類型: 行為型模式 每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那么它會把相同的請求傳給下一個接收者,依此類推。 目的: 職責鏈上的處理者負責處理請求,客戶只需要將請求發(fā)送到職責鏈上即可,無須關心請求的處理細節(jié)和請求的傳遞,所

    2024年02月05日
    瀏覽(23)
  • 【設計模式-05】Facade門面Mediator調停者 | Decorator裝飾器 | Chain Of Responsibility責任鏈

    【設計模式-05】Facade門面Mediator調停者 | Decorator裝飾器 | Chain Of Responsibility責任鏈

    一般是系統(tǒng)內部相互交錯,比如 消息中間件(MQ) 就是這種設計模式,對各個功能或系統(tǒng)之間進行解耦。 業(yè)務場景:論壇或者博客發(fā)表帖子或者評論,對敏感詞過濾處理。使用責任鏈的模式進行過濾處理。 把變化的進行封裝處理 核心代碼實現(xiàn) GitHub - jxaufang168/Design-Patterns: 設計

    2024年01月19日
    瀏覽(63)
  • (二)結構型模式:5、裝飾器模式(Decorator Pattern)(C++實例)

    (二)結構型模式:5、裝飾器模式(Decorator Pattern)(C++實例)

    目錄 1、裝飾器模式(Decorator Pattern)含義 2、裝飾器模式的UML圖學習 3、裝飾器模式的應用場景 4、裝飾器模式的優(yōu)缺點 5、C++實現(xiàn)裝飾器模式的簡單實例 1、裝飾器模式(Decorator Pattern)含義 裝飾模式(Decorator),動態(tài)地給一個對象添加一些額外地職責,就增加功能來說,裝

    2024年02月12日
    瀏覽(23)
  • Java 設計者模式以及與Spring關系(六) 裝飾和模版方法模式

    Java 設計者模式以及與Spring關系(六) 裝飾和模版方法模式

    本文是個系列一次會出兩個設計者模式作用,如果有關聯(lián)就三個,除此外還會講解在spring中作用。 23設計者模式以及重點模式 我們都知道 設計者模式 有 3 類 23 種設計模式,標紅是特別重要的設計者模式建議都會,而且熟讀于心,標藍是指其次重要建議也要明白。 (1)創(chuàng)建

    2024年01月24日
    瀏覽(25)
  • 狀態(tài)設計模式(State Pattern)[論點:概念、相關角色、圖示、示例代碼、框架中的運用、適用場景]

    狀態(tài)設計模式(State Pattern)[論點:概念、相關角色、圖示、示例代碼、框架中的運用、適用場景]

    ??????? 狀態(tài)模式 (State Pattern)是一種行為型設計模式,用于解決對象在不同狀態(tài)下的行為問題。它允許一個對象在其內部狀態(tài)改變時改變它的行為。狀態(tài)模式主要包含三個部分: 上下文 (Context)、 狀態(tài)接口 (State)和 具體狀態(tài)實現(xiàn)類 (ConcreteState)。 狀態(tài)接口(St

    2023年04月14日
    瀏覽(28)
  • 命令設計模式(Command Pattern)[論點:概念、組成角色、相關圖示、示例代碼、框架中的運用、適用場景]

    命令設計模式(Command Pattern)[論點:概念、組成角色、相關圖示、示例代碼、框架中的運用、適用場景]

    ??????? 命令設計模式 (Command Pattern)是一種行為設計模式,它將請求的操作封裝為一個對象,從而實現(xiàn)請求者和執(zhí)行者之間的解耦。這樣,請求者只需要知道如何發(fā)送請求,而無需關心請求的具體執(zhí)行過程。命令模式在很多場景下都非常有用,例如撤銷操作、延遲執(zhí)行、

    2024年02月01日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包