程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> 裝飾設計模式

裝飾設計模式

編輯:JAVA編程入門知識

裝飾設計模式就是對已有的對象的功能進行增強

簡單小例子:

class Person  
{  
    void chifan()  
    {  
        System.out.println("chifan");  
    }  
}  
  
/* 
為了不隨便改變原有的代碼。 
還要增強chifan功能。 
那麼就定義一個類,對原有對象進行裝飾。
 by 何問起 
*/  
class NewPerson  
{  
    private Person p;  
    NewPerson(Person p)  
    {  
        this.p = p;  
    }  
    public void newChifan()  
    {     
        System.out.println("來一杯");  
        p.chifan();  
        System.out.println("來一根");  
    }  
}  
  
class  PersonDemo  
{  
    public static void main(String[] args)   
    {  
        Person p = new Person();  
          
        //NewPerson np = new NewPerson(p);  
        //np.newChifan();  
  
        p.chifan();  
    }  
}  

// hovertree.com

我們考慮一下使用繼承也可以對父類中的功能進行增強只需要調用super就可以調用父類的方法,那使用裝飾和繼承有什麼區別?
使用繼承體系就會有點臃腫,因為當平房想要改成歐式時,還要建立子類。

Writer
|--FileWriter  
|--BufferedFileWriter。
|--DataWriter
|--BufferedDataWriter。
|--MediaWriter
|--BufferedMediaWriter.

優化:
可以將緩沖技術單獨抽取進行封裝。
要緩沖區誰將誰和緩沖相關聯即可。
這樣的設計的相對體系會變的簡單。

使用繼承帶來的局限性:

/* 
房子:平房,樓房。 
 
House 
    |--PingFang 
    |--LouFang 
 
 
准備對房子進行裝修。 
 
    1,對平房進行田園風光式的打造。 
    2,對樓房進行歐式風格的打造。 
可以用繼承的方式來完成。 
House 
    |--PingFang 
        |--TianYuanPingFang 
    |--LouFang 
        |--OuShiLouFang 
 
     
該體系就有點臃腫,因為當平房想要改成歐式時,還要建立子類。 
何問起
hovertree.com
*/  
abstract class House  
{  
    abstract void show();  
}  
  
class PingFang extends House  
{  
    public void show()  
    {  
        System.out.println("平房");  
    }  
}  
  
class TianYuanPingFang extends PingFang  
{  
    public void showTianYuan()  
    {  
        super.show();  
        System.out.println("田園風格");  
    }     
}  
  
class LouFang extends House  
{  
    public void show()  
    {  
        System.out.println("樓房");  
    }  
}  
class OuShiLouFang extends LouFang  
{  
    public void showOuShi()  
    {  
        super.show();  
        System.out.println("歐式風格");  
    }  
}  
  
  
  
class  HouseDemo  
{  
    public static void main(String[] args)   
    {  
        PingFang p = new PingFang();  
        ///p.show();  
  
        TianYuanPingFang t = new TianYuanPingFang();  
        t.showTianYuan();  
  
  
        LouFang l = new LouFang();  
        //l.show();  
        OuShiLouFang o = new OuShiLouFang();  
        o.showOuShi();  
    }  
}  

使用裝飾設計模式進行裝飾:

/* 
 
原體系: 
House 
    |--PingFang 
    |--LouFang 
無論將平房打造成田園還是歐式,都是對平房一種裝修。 
而該裝修也可以用樓房。 
 by 何問起
hovertree.com
將現將該裝修定義好,需要把什麼房子進行改裝修,傳入即可。 
House 
    |--PingFang 
    |--LouFang 
    |--TianYuan 
    |--OuShi 
 
*/  
abstract class House  
{  
    abstract void show();  
}  
  
class PingFang extends House  
{  
    public void show()  
    {  
        System.out.println("平房");  
    }  
}  
  
  
class LouFang extends House  
{  
    public void show()  
    {  
        System.out.println("樓房");  
    }  
}  
  
  
class TianYuan extends House  
{  
  
    private House h;  
    TianYuan(House h)  
    {  
        this.h = h;  
    }  
    public void show()  
    {  
        System.out.println("田園風格");  
    }  
  
    public void showTianYuan()  
    {  
        h.show();  
        this.show();  
    }  
  
}  
  
  
class OuShi extends House  
{  
    private House h;  
    OuShi(House h)  
    {  
        this.h = h;  
    }  
    public void show()  
    {  
        System.out.println("歐式風格");  
    }  
  
    public void showOuShi()  
    {  
        h.show();  
        this.show();  
    }  
  
}  
  
class  HouseDemo2  
{  
    public static void main(String[] args)   
    {  
        PingFang p = new PingFang();  
        LouFang l = new LouFang();  
  
        OuShi o = new OuShi(new TianYuan(p));  
        o.showOuShi();  
  
        //TianYuan t = new TianYuan(l);  
        //t.showTianYuan();  
  
        //OuShi o = new OuShi(l);  
        //o.showOuShi();  
    }  
}  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved