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

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

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|

服務器之家 - 編程語言 - JAVA教程 - JAVA裝飾者模式(從現實生活角度理解代碼原理)

JAVA裝飾者模式(從現實生活角度理解代碼原理)

2020-07-09 10:28潘侯爺 JAVA教程

裝飾者模式可以動態地給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比生成子類更為靈活。這篇文章主要介紹了JAVA裝飾者模式的相關資料,需要的朋友可以參考下

裝飾者模式可以動態地給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比生成子類更為靈活。

該模式的適用環境為:

(1)在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責。

(2)處理那些可以撤消的職責。

(3)當不能采用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,為支持每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用于生成子類。

實現該模式的關鍵步驟:

(1)Component(被裝飾對象基類):定義對象的接口,可以給這些對象動態增加職責;

(2)ConcreteComponent(具體被裝飾對象):定義具體的對象,Decorator可以給它增加額外的職責;

(3)Decorator(裝飾者抽象類):維護指向Component實例的引用,定義與Component一致的接口(也就是要繼承或實現被裝飾對象基類);

(4)ConcreteDecorator(具體裝飾者):具體的裝飾對象,給內部持有的具體被裝飾對象增加具體的職責;

這樣講大家可能有些不好理解,那我們還是老規矩安靜:

入冬以后天氣越來越冷了,下班之后,做為資深吃貨,約上二三好友痛快的來場火鍋盛宴再爽不過了。說到火鍋,不得不提在成都吃過的大龍燚火鍋,各種鍋底,配菜應有盡有,但我最喜歡的還是大龍燚火鍋原味鍋底、麻辣牛肉、大刀毛肚、天味香腸、砣砣牛肉、麻辣排骨等,想想都流口水啊。

說道這大家結合裝飾者的實現步驟,應該有點感覺了吧,上文提到的鍋底,其實就是被裝飾對象的基類,配料其實就是裝飾者抽象類,大龍燚火鍋原味鍋底這些具體的鍋底也就是具體的被裝飾對象了,麻辣牛肉、大刀毛肚、天味香腸、砣砣牛肉、麻辣排骨這些裝飾鍋底用的各種配菜也就是具體的裝飾對象。說道這,大家應該都豁然開朗了吧,下面我們開始具體的代碼實現:

第一步:定義被裝飾對象基類(可以是抽象類也可以是接口)

?
1
2
3
4
public interface GuoDi {
  public float cost();//鍋底當然要有價錢啦
  public String name();//名字也得有哦
}

第二步:定義具體被裝飾對象(也就是各種鍋底,這里定義兩種)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class YuanYang implements GuoDi {
  @Override
  public float cost() {
    return 48.0f;
  }
  @Override
  public String name() {
    return "鴛鴦鍋底";
  }
}
public class DaLongYan implements GuoDi{
  @Override
  public float cost() {
    return 59.0f;
  }
  @Override
  public String name() {
    return "大龍燚火鍋原味鍋底";
  }
}

第三步:定義裝飾者抽象類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public abstract class PeiCai implements GuoDi {
  private GuoDi guodi;
  public FoodDecorator(GuoDi guodi) {
    super();
    this.guodi = guodi;
  }
  @Override
  public float cost() {
    return guodi.cost();
  }
  @Override
  public String name() {
    return guodi.name();
  }
}

第四步:定義具體的裝飾者對象

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class MaLaNiuRou extends PeiCai {
  public MaLaNiuRou(GuoDi guodi) {
    super(guodi);
  }
  @Override
  public float cost() {
    return super.cost()+46f;
  }
  @Override
  public String name() {
    return super.name()+"+麻辣牛肉";
  }
}
public class MaoDu extends PeiCai {
 
  public MaoDu(GuoDi guodi) {
    super(guodi);
  }
  @Override
  public float cost() {
    return super.cost()+30f;
  }
  @Override
  public String name() {
    return super.name()+"+大刀毛肚";
  }
}

測試類:

?
1
2
3
4
5
6
7
8
public class Test {
  public static void main(String[] args) {
    GuoDi guodi = new DaLongYan ();//點個大龍燚火鍋原味鍋底
    MaLaNiuRou y = new MaLaNiuRou(guodi);//來個麻辣牛肉
    MaoDu x = new MaoDu(y);//在麻辣牛肉的基礎上再來個大刀毛肚
    System.out.println("一共點了"+x.name()+",共消費"+s.cost());
  }
}

輸出結果:

 1 一共點了大龍燚火鍋原味鍋底+麻辣牛肉+大刀毛肚,共消費135

以上所述是小編給大家介紹的JAVA裝飾者模式(從現實生活角度理解代碼原理),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

原文鏈接:http://www.cnblogs.com/panhouye/archive/2016/11/30/6120232.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 变态 调教 视频 国产九色 | 俺去俺去啦最新官网在线 | 国产精品乱码高清在线观看 | 91九色国产porny | 欧美综合亚洲图片综合区 | 天天天做天天天天爱天天想 | 日韩激情视频在线观看 | 欧美在线播放一区二区 | 国产亚洲精品高清在线 | 婷婷精品进入 | 韩国最新理论三级在线观看 | 亚洲乱码一二三四五六区 | 女人是男人的未来1分49分 | 十大免费批日的软件 | 欧美jjvideo | 热99re久久精品国产首页 | 日韩制服丝袜在线观看 | 国产香蕉97碰碰在线视频 | 香蕉91| 欧美日本道免费一区二区三区 | 精品国产在天天线在线麻豆 | 亚洲精品国产精品精 | 2020年最新国产精品视频免费 | ts视频在线观看 | 好吊色永久免费视频大全 | 国产精品片 | 亚洲一成人毛片 | 动漫美女胸被狂揉扒开吃奶动态图 | 成人在线一区二区三区 | 午夜网 | 2019天天干夜夜操 | 帅老头恋帅老头同性tv | www.在线观看视频 | 亚洲男人天堂av | 国产欧美曰韩一区二区三区 | 十八女下面流水不遮免费 | 脱女学小内内摸出水网站免费 | 日本sss在线高清观看 | 久久精品国产色蜜蜜麻豆国语版 | 免费国产之a视频 | 星星动漫在线观看免费 |