一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - Java設計模式之裝飾模式原理與用法實例詳解

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

2021-04-24 10:57aronykl Java教程

這篇文章主要介紹了Java設計模式之裝飾模式原理與用法,結合實例形式詳細分析了裝飾模式的概念、原理、定義與使用方法,并總結分析了裝飾模式的優缺點,具有一定參考借鑒價值,需要的朋友可以參考下

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

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

裝飾模式的角色的組成:

抽象構件(component)角色:給出一個抽象接口,以規范準備接收附加工功能的對象。(inputstream、outputstream)
具體構件(concrete component)角色:定義一個將要接收附加功能的類。(節點流)
裝飾(decorator)角色:持有一個構件(component)對象的實例,并實現一個與抽象構件接口一致的接口。(過濾流filterinputstream、filteroutputstream)
具體裝飾(concrete decorator)角色:負責給構件對象添加上附加的功能。(帶具體附加功能的過濾流,bufferedinputstream,datainputstream等)

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

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

?
1
2
3
4
5
package com.tydic.decorator;
//抽象構件角色
public interface component {
  public void dosomething();
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
package com.tydic.decorator;
/**
 * 具體構建角色,實現抽象構建角色
 * @author administrator
 *
 */
public class concretecomponent implements component {
  @override
  public void dosomething() {
    system.out.println("功能a");
  }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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. 具體裝飾角色:需要繼承裝飾角色,并且給出要附加的功能

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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");
  }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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. 編寫客戶端代碼

?
1
2
3
4
5
6
7
8
9
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程序設計有所幫助。

原文鏈接:https://blog.csdn.net/zw19910924/article/details/45226537

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美丝袜videohd | 久草在在线免视频在线观看 | 亚洲AV国产福利精品在现观看 | 丝瓜草莓香蕉绿巨人幸福宝 | 美女用手扒开粉嫩的屁股 | 91庥豆果冻天美精东蜜桃传媒 | 国产精品制服丝袜白丝www | 国产精品理论片 | 美琪美腿白丝交小说 | 国产麻豆91欧美一区二区 | 国自产在线精品免费 | 无套内射在线观看THEPORN | 成人福利在线播放 | 69日本xxⅹxxxxx19 | 国产一区二区播放 | 精品国产福利一区二区在线 | 国内精品一区视频在线播放 | 国产在线xvideos | 精品在线一区 | 涩涩五月天| 四虎欧美| 99国产成人精品2021 | 午夜福利试看120秒体验区 | 1024日韩基地 | 800精品国产导航 | 十六以下岁女子毛片免费 | 精品性影院一区二区三区内射 | fistingvideos头交尿眼 | 欧美日韩国产精品va | 日本卡一卡2卡3卡4精品卡无人区 | 亚洲精品一区制服丝袜 | 亚洲日日操 | 美女被扒开屁股进去网 | 国模孕妇季玥全部人体写真 | 日本xx高清视频免费观看 | 国产午夜精品久久久久 | 美女撒尿部位无遮挡 | 免费观看欧美性一级 | 韩国三级年轻小的胰子完整 | 亚洲性爱区 | free性丰满hd性欧美厨房 |