您的位置:首页 > 职场人生

黑马程序员------装饰设计模式

2012-11-15 21:37 501 查看
----------- android培训java培训、java学习型技术博客、期待与您交流! ------------点击打开链接

关于装饰设计模式
      设计模式就是解决一类问题而行之有效的方法,装饰设计模式就是解决,对 已有对象进行功能增强,而又不去改变对象本身的问题。
简单小例子:

[java]
view plaincopy

class Person  
{  
    void chifan()  
    {  
        System.out.println("chifan");  
    }  
}  
  
/* 
为了不随便改变原有的代码。 
还要增强chifan功能。 
那么就定义一个类,对原有对象进行装饰。 
*/  
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();  
    }  
}  

在这个例子中,就是通过定义了一个NewPerson类来和Person类关联,只需通过传参让Person类和装饰类关联扩展Person对象的功能。

使用继承带来的局限性:

[java]
view plaincopy

/* 
房子:平房,楼房。 
 
House 
    |--PingFang 
    |--LouFang 
 
 
准备对房子进行装修。 
 
    1,对平房进行田园风光式的打造。 
    2,对楼房进行欧式风格的打造。 
可以用继承的方式来完成。 
House 
    |--PingFang 
        |--TianYuanPingFang 
    |--LouFang 
        |--OuShiLouFang 
 
     
该体系就有点臃肿,因为当平房想要改成欧式时,还要建立子类。 
*/  
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();  
  
<
bc13
span>  
        LouFang l = new LouFang();  
        //l.show();  
        OuShiLouFang o = new OuShiLouFang();  
        o.showOuShi();  
    }  
}  

使用装饰设计模式进行装饰:

[java]
view plaincopy

/* 
 
原体系: 
House 
    |--PingFang 
    |--LouFang 
无论将平房打造成田园还是欧式,都是对平房一种装修。 
而该装修也可以用楼房。 
 
将现将该装修定义好,需要把什么房子进行改装修,传入即可。 
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();  
    }  
}
Writer
|--FileWriter

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

优化:

可以将缓冲技术单独抽取进行封装。

要缓冲区谁将谁和缓冲相关联即可。

这样的设计的相对体系会变的简单。
----------- android培训java培训、java学习型技术博客、期待与您交流! ------------


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: