裝飾者模式 : 動態的將責任附加在對象之上。若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案 。java
在這個設計模式 首先你要搞清楚 什麼是裝飾者,什麼是被裝飾者。 看下面的例子,你去星巴克喝咖啡 你能夠在點了拿鐵咖啡以後,你還想往裏面加入奶昔,牛奶,方糖等。設計模式
那麼 此時的 奶昔,牛奶,以及方糖就是 裝飾,用來裝飾咖啡的,那個 咖啡就是被裝飾者。ide
現有以下 需求場景 : 星巴克 有各類飲料,好比 咖啡,橙汁,綠茶等,還有許多的調料 好比牛奶,方糖,奶昔等,而這些調料是須要收費的, 飲料和調料能夠互相整合, 等會好以後一塊兒打印出來 用戶點了那些東西,以及計算出總價錢。測試
因爲裝飾者和被裝飾者是能夠互相整合的,那麼他們必須是相同的 「類型」, 這裏使用的集成並非爲了在程序運行的時候表現出相應的行爲,而只是爲了類型上面的匹配。 看以下的 UMl 圖:ui
從圖中 能夠知道 Beverage (飲料) 是被裝飾者,它是個父類,有具體的被裝飾者 : 橙汁,綠茶,咖啡 this
還有 一個調料類 Condiment 類, 它下面的是具體的 裝飾者 具體的是 Milk,Mocha,Whip , 裝飾者和被裝飾者都有相同的父類,以保證他們能夠互相整合。spa
具體的實現代碼 以下:設計
先寫被裝飾者:對象
package com.beizhuangshi.www;繼承
public abstract class Beverage
{
public String descrption;
public String getDescrption()
{
return descrption;
}
public abstract double cost();
}
//具體的被裝飾者
package com.beizhuangshi.www;
/** */
public class Tea extends Beverage
{
/** */
public Tea()
{
descrption = " Tea";
}
/** */
public double cost()
{
return 3.0;
}
}
package com.beizhuangshi.www;
/** */
public class OrangeJuice extends Beverage
{
/** */
public double cost()
{
return 2.0;
}
/** */
public OrangeJuice()
{
descrption ="OrangeJuice";
}
}
package com.beizhuangshi.www;
/** */
public class Coffe extends Beverage
{
/** */
public Coffe()
{
descrption = "Coffe";
}
public double cost()
{
return 1.0;
}
}
//下面實現裝飾者
package com.zhuangshizhe.www;
import com.beizhuangshi.www.Beverage;
/** */
public abstract class Condiment extends Beverage
{
public abstract String getDescrption();
}
package com.zhuangshizhe.www;
import com.beizhuangshi.www.Beverage;
/** */
public class Milk extends Condiment
{
/** */
public Beverage beverage;
public Milk(Beverage beverage){
this.beverage = beverage;
}
@Override
public String getDescrption()
{
return beverage.getDescrption() + " Milk" ;
}
/** */
@Override
public double cost()
{
return beverage.cost() + 4.0;
}
}
package com.zhuangshizhe.www;
import com.beizhuangshi.www.Beverage;
/** */
public class Mocha extends Condiment
{
public Beverage beverage;
public Mocha(Beverage beverage){
this.beverage = beverage;
}
@Override
public String getDescrption()
{
return beverage.getDescrption() + " Mocha " ;
}
/** */
@Override
public double cost()
{
return beverage.cost() + 5.02;
}
}
package com.zhuangshizhe.www;
import com.beizhuangshi.www.Beverage;
/** */
public class Whip extends Condiment
{
/** */
public Beverage beverage;
public Whip(Beverage beverage){
this.beverage = beverage;
}
@Override
public String getDescrption()
{
return beverage.getDescrption() + " Whip " ;
}
/** */
@Override
public double cost()
{
return beverage.cost() + 6.02;
}
}
//測試一下
package com.zhuangshizhe.test.www;
import com.beizhuangshi.www.Beverage;
import com.beizhuangshi.www.Tea;
import com.zhuangshizhe.www.Milk;
public class Test {
public static void main(String[] args){
Beverage teaBeverage = new Tea();
System.out.println(teaBeverage.getDescrption() + " Cost" + teaBeverage.cost());
teaBeverage = new Milk(teaBeverage);
teaBeverage= new Milk(teaBeverage);
System.out.println(teaBeverage.getDescrption() + " Cost" + teaBeverage.cost());
}
}
看看下面的java.io 這裏面的 FileReader ,BufferedReader 全是裝飾者
package com.fileReader.www;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.InputStream;
public class FileReaderTest {
public static void main(String[] args){ File f = new File("D://PassWord.txt"); FileReader fr = null; BufferedReader buf = null; try { fr = new FileReader(f); buf = new BufferedReader(fr); String context = null; while((context = buf.readLine())!=null){ System.out.println(context); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try{ if(fr!=null){ fr.close(); } if(buf!= null){ buf.close(); } }catch(Exception e){ e.printStackTrace(); } } }}