- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- Java設計模式之裝飾模式詳解
一個(gè)快餐店計算價(jià)格問(wèn)題舉例:
快餐店有炒面、炒飯這些快餐,可以額外附加雞蛋、火腿、培根這些配菜,加配菜需要額外加錢(qián),并且每個(gè)配菜的價(jià)錢(qián)不一樣,計算快餐價(jià)格如何實(shí)現?
橫向擴展性不好:如果要再加一種配料(火腿腸),我們就會(huì )發(fā)現需要給FriedRice和FriedNoodles分別定義一個(gè)子類(lèi)。如果要新增一個(gè)快餐品類(lèi)(炒河粉)的話(huà),就需要定義更多的子,會(huì )出現類(lèi)爆炸的問(wèn)題。
繼承適合于縱向擴展
(1)構件代碼
//快餐接口--抽象類(lèi)或接口實(shí)現都可以 public abstract class FastFood { private float price; private String desc; public FastFood() { } public FastFood(float price, String desc) { this.price = price; this.desc = desc; } public void setPrice(float price) { this.price = price; } public float getPrice() { return price; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public abstract float cost(); //獲取價(jià)格 } //炒飯 public class FriedRice extends FastFood { public FriedRice() { super(10, "炒飯"); } public float cost() { return getPrice(); } } //炒面 public class FriedNoodles extends FastFood { public FriedNoodles() { super(12, "炒面"); } public float cost() { return getPrice(); } }
(2)抽象裝飾代碼
package com.fupinng3.gar; /** * 抽象裝飾 * 即繼承自FastFood,又聚合FastFood */ public abstract class Garnish extends FastFood{ private FastFood fastFood; public Garnish() { } public FastFood getFastFood() { return fastFood; } public void setFastFood(FastFood fastFood) { this.fastFood = fastFood; } public Garnish(FastFood fastFood,float price, String desc) { super(price, desc); this.fastFood = fastFood; } }
(3)具體裝飾
package com.fupinng3.gar; public class Egg extends Garnish{ public Egg(FastFood fastFood) { super(fastFood, 2, "雞蛋"); } @Override public float cost() { return getPrice()+getFastFood().cost(); } @Override public String getDesc() { String str1=super.getDesc(); String str2=getFastFood().getDesc(); return str1+str2; } } package com.fupinng3.gar; public class Bacon extends Garnish{ public Bacon(FastFood fastFood) { super(fastFood, 5, "培根"); } public float cost() { return getPrice()+getFastFood().cost(); } @Override public String getDesc() { return super.getDesc()+getFastFood().getDesc(); } }
(4)測試代碼
package com.fupinng3.gar; public class Test { public static void main(String[] args) { //來(lái)個(gè)炒面 FastFood fastFood=new FriedNoodles(); System.out.println(fastFood.getDesc()+"\t"+fastFood.cost()+"元"); //加個(gè)雞蛋 fastFood=new Egg(fastFood); System.out.println(fastFood.getDesc()+"\t"+fastFood.cost()+"元"); //再加個(gè)雞蛋 fastFood=new Egg(fastFood); System.out.println(fastFood.getDesc()+"\t"+fastFood.cost()+"元"); //再加個(gè)培根 fastFood=new Bacon(fastFood); System.out.println(fastFood.getDesc()+"\t"+fastFood.cost()+"元"); } }
(5)輸出
炒面 20.0元
雞蛋炒面 22.0元
雞蛋雞蛋炒面 24.0元
培根雞蛋雞蛋炒面 29.0元
一個(gè)現實(shí)生活中的裝飾模式例子:各種顏色、圖案形成的俄羅斯套娃
(1)相同點(diǎn):都是增強目標方法
(2)不同點(diǎn):(如下2個(gè)不同點(diǎn)可以理解為1個(gè))
到此這篇關(guān)于Java設計模式之裝飾模式詳解的文章就介紹到這了,更多相關(guān)Java裝飾模式內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系站長(cháng)郵箱:ts@56dr.com進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2