中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java的裝飾者模式是什么

發布時間:2021-09-04 22:05:39 來源:億速云 閱讀:124 作者:chen 欄目:編程語言

本篇內容介紹了“java的裝飾者模式是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!



一、裝飾者模式的基本介紹
1.1 意圖

動態地給一個對象添加額外的職責。


1.2 結構

裝飾者模式的基本結構如下:


java的裝飾者模式是什么

  • Component

    定義一個對象接口,可以給這些對象動態地添加職責。

  • ConcreteComponent

定義一個對象,可以給這個對象添加一些職責。
  • Decorator

裝飾角色,持有一個Component對象的實例,并定義一個與Componnet接口一致的接口。

  • ConcreteDecorator


具體裝飾角色,負責給組件添加職責。

二、裝飾者模式示例

西游記中的孫悟空,具有七十二般變化,給我們留下了深刻的印象,他的每一種變化都給他帶來了一種新的本領。他變成魚兒時,就可以到水里游泳;他變成雀兒,就可以在天上飛行。
下面我們就以齊天大圣的例子來完成一個裝飾者模式的例子:

java的裝飾者模式是什么

  • TheGreatestSage (Component)

package com.wangmengjun.tutorial.designpattern.decorator;
public interface TheGreatestSage {
 void move();}
  • Change (Decorator)

package com.wangmengjun.tutorial.designpattern.decorator;
public class Change implements TheGreatestSage {
 private TheGreatestSage sage;    public Change(TheGreatestSage sage) {    this.sage = sage;  }
 public void move() {    sage.move();  }
}

  • Monkey (ConcreteComponent)

package com.wangmengjun.tutorial.designpattern.decorator;
public class Monkey implements TheGreatestSage {
 public void move() {    System.out.println("Monkey move~~");  }
}
  • Bird (ConcreteDecorator1)

package com.wangmengjun.tutorial.designpattern.decorator;
public class Bird extends  Change {
 public Bird(TheGreatestSage sage) {    super(sage);  }
 @Override  public void move() {    System.out.println("Bird move~~");  }}

  • Fish(ConcreteDecorator2)

package com.wangmengjun.tutorial.designpattern.decorator;
public class Fish extends  Change {
 public Fish(TheGreatestSage sage) {    super(sage);  }
 @Override  public void move() {    System.out.println("Fish move~~");  }}

對象包裝示例:
package com.wangmengjun.tutorial.designpattern.decorator;
public class Client {    public static void main(String[] args) {    TheGreatestSage sage = new Monkey();        /**     * 單層封裝     */    TheGreatestSage bird = new Bird(sage);    //bird.move();        TheGreatestSage fish = new Fish(bird);    //fish.move();        /**     * 多層封裝     */    TheGreatestSage fish3 = new Fish(new Bird(sage));    fish3.move();  }
}

java的裝飾者模式是什么

這種方式是否似曾相識 ? 

大家回憶一下JDK中的io流的創建方式是否也是如此。一個InpuStream的簡單結構如下:  

java的裝飾者模式是什么

new BufferedReader(new FileReader("F:\\test.txt"));

三、小結

3.1 適用場景

在以下 情況下可以使用裝飾模式:
  • 需要擴展一個類的功能,或者給一個類增加附加責任。

  • 需要動態地給一個對象增加功能,這些功能可以再動態地撤銷。

  • 需要增加由一些基本功能的排列組合而產生的非常大量的功能,從而使繼承關系變得不現實。


3.2 優點 vs 缺點

優點

  • 裝飾模式與繼承關系的目的都是擴展對象的功能,但是裝飾模式可以提供比繼承更多的靈活性。裝飾模式允許系統動態地決定“貼上”一個需要的“裝飾”,或者去除一個不需要的“裝飾”。而繼承關系則不同,繼承關系是靜態的,它在系統運行前就決定了,運行時是不能改變的。

  • 裝飾者模式不試圖在一個復雜的可定制的類中支持所有可預見的特性。相反你可以定義一個簡單的類,并且使用Decorator類給它逐漸的添加功能。可以從一個簡單的部件組合出復雜的功能。可以創造出出很多不同行為的組合。

缺點

  • 使用裝飾模式會產生比使用繼承關系更多的對象,這些對象看上去類似。更多的對象會使得查錯變得困難,特別是這些對象看上去都很相像。

“java的裝飾者模式是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广宗县| 三河市| 高尔夫| 大余县| 隆德县| 临城县| 清河县| 农安县| 城步| 清水县| 关岭| 青川县| 壶关县| 蒙山县| 曲水县| 太仆寺旗| 桓台县| 八宿县| 简阳市| 皮山县| 德惠市| 综艺| 鞍山市| 浦东新区| 苏尼特左旗| 安吉县| 西乌珠穆沁旗| 阳东县| 漳平市| 突泉县| 吉木乃县| 青川县| 绍兴市| 澜沧| 株洲市| 新郑市| 五大连池市| 新河县| 安岳县| 三江| 阿城市|