裝飾者模式

裝飾者模式 : 動態的將責任附加在對象之上。若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案 。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();   }  }          }}

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息