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

溫馨提示×

溫馨提示×

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

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

Java設計模式之裝飾模式原理與用法實例詳解

發布時間:2020-09-22 13:39:00 來源:腳本之家 閱讀:128 作者:aronykl 欄目:編程語言

本文實例講述了Java設計模式之裝飾模式原理與用法。分享給大家供大家參考,具體如下:

裝飾模式能在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。JDK中IO的設計就用到了裝飾模式,通過過濾流對節點流進行包裝來實現功能的擴展。

裝飾模式的角色的組成:

抽象構件(Component)角色:給出一個抽象接口,以規范準備接收附加工功能的對象。(InputStream、OutputStream)
具體構件(Concrete Component)角色:定義一個將要接收附加功能的類。(節點流)
裝飾(Decorator)角色:持有一個構件(Component)對象的實例,并實現一個與抽象構件接口一致的接口。(過濾流FilterInputStream、FilterOutputStream)
具體裝飾(Concrete Decorator)角色:負責給構件對象添加上附加的功能。(帶具體附加功能的過濾流,BufferedInputStream,DataInputStream等)

以下給出一個裝飾模式的簡單的例子:

1. 抽象構件角色:定義一個接口Component

package com.tydic.decorator;
//抽象構件角色
public interface Component {
  public void doSomething();
}

2. 具體構建角色:需要實現抽象構件角色,可以給這個對象添加一些職責。

package com.tydic.decorator;
/**
 * 具體構建角色,實現抽象構建角色
 * @author Administrator
 *
 */
public class ConcreteComponent implements Component {
  @Override
  public void doSomething() {
    System.out.println("功能A");
  }
}

3. 裝飾角色:持有一個對象構建角色的引用,并且實現抽象構件角色。實現抽象構件角色是因為要保證增加了功能過后,類型不能發生改變,就像FilterInputStream還是一個輸入流,仍然帶有輸入流的特性。而持有一個對象構建角色的引用是因為要想增加功能,就必須持有要被附加功能的構件角色的引用。

package com.tydic.decorator;
/**
 * 裝飾角色,持有一個構件角色的引用,并且實現構件角色
 * 要想增加功能過后還是這個類型的構件就必須實現構件角色,要想增加功能,就必須持有要被附加功能的構件角色的引用,這就是為什么必須持有一個構件角色的引用
 * @author Administrator
 *
 */
public class Decorator implements Component {
  private Component component;//這是要被附加功能的構件角色,可通過實例化的時候傳進來
  public Decorator(Component component) {
    this.component = component;
  }
  @Override
  public void doSomething() {
    component.doSomething();
  }
}

4. 具體裝飾角色:需要繼承裝飾角色,并且給出要附加的功能

package com.tydic.decorator;
/**
 * 具體裝飾角色1,需要繼承裝飾角色,并且給出要附加的功能
 * @author Administrator
 *
 */
public class ConcreteDecorator1 extends Decorator {
  public ConcreteDecorator1(Component component) {
    super(component);
  }
  @Override
  public void doSomething() {
    super.doSomething();
    this.doAnothing();//在傳過來的具體構件角色原有功能的基礎上附加的功能
  }
  //附加的功能
  public void doAnothing() {
    System.out.println("功能B");
  }
}

package com.tydic.decorator;
/**
 * 具體裝飾角色2,需要繼承裝飾角色,并且給出要附加的功能
 * @author Administrator
 *
 */
public class ConcreteDecorator2 extends Decorator {
  public ConcreteDecorator2(Component component) {
    super(component);
  }
  @Override
  public void doSomething() {
    super.doSomething();
    this.doAnothing();//在傳過來的具體構件角色原有功能的基礎上附加的功能
  }
  //附加的功能
  public void doAnothing() {
    System.out.println("功能c");
  }
}

5. 編寫客戶端代碼

package com.tydic.decorator;
public class Client {
  public static void main(String[] args) {
    Component component = new ConcreteComponent();//具體構建角色
    Component component2 = new ConcreteDecorator1(component);//對component這個構件進行裝飾
    Component component3 = new ConcreteDecorator2(component2);//對component2這個構件進行裝飾
    component3.doSomething();
  }
}

總結:

裝飾模式能夠利用組合的做法,再不用繼承的情況下,在運行時動態的對對象進行擴展。這是繼承所做不到的。繼承是靜態的,對類的擴展。

裝飾模式的優缺點:

優點:1.擴展對象的功能,比繼承更加靈活。2. 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行為的組合。

缺點:會使程序變的比較復雜。

更多java相關內容感興趣的讀者可查看本站專題:《Java面向對象程序設計入門與進階教程》、《Java數據結構與算法教程》、《Java操作DOM節點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》

希望本文所述對大家java程序設計有所幫助。

向AI問一下細節

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

AI

冷水江市| 无极县| 盐城市| 满洲里市| 明溪县| 青阳县| 长沙市| 神农架林区| 瓦房店市| 泽州县| 互助| 西丰县| 秦皇岛市| 古蔺县| 闽清县| 侯马市| 上林县| 龙游县| 岳普湖县| 进贤县| 余干县| 贵定县| 崇文区| 长兴县| 嘉善县| 象州县| 连平县| 赤壁市| 鄄城县| 汨罗市| 宁都县| 新巴尔虎右旗| 青神县| 凤山县| 长垣县| 常熟市| 大同市| 吉木萨尔县| 天门市| 宁蒗| 涡阳县|