黑马程序员技术交流社区

标题: 装饰设计模式理解 [打印本页]

作者: 霍明波    时间: 2012-8-20 22:30
标题: 装饰设计模式理解
在毕老师讲BufferReader的时候说过一个装饰设计模式,意思是对已有的对象进行功能的增强,理解的很模糊,请高手举两个实例点拨一下?谢谢
作者: 黄敏    时间: 2012-8-20 23:27
装饰设计模式就是对已有的对象的功能进行增强
说白了就是为了避免继承带来的体积臃肿而产生的,

简单小例子:


[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();  
    }  
}  

我们考虑一下使用继承也可以对父类中的功能进行增强只需要调用super就可以调用父类的方法,那使用装饰和继承有什么区别?
使用继承体系就会有点臃肿,因为当平房想要改成欧式时,还要建立子类。


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

优化:
可以将缓冲技术单独抽取进行封装。
要缓冲区谁将谁和缓冲相关联即可。
这样的设计的相对体系会变的简单。

使用继承带来的局限性:


[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();  
  
  
        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();  
    }  
}


做的笔记,希望对你有帮助
作者: 霍明波    时间: 2012-8-21 08:31
黄敏 发表于 2012-8-20 23:27
装饰设计模式就是对已有的对象的功能进行增强
说白了就是为了避免继承带来的体积臃肿而产生的,

嗯  谢谢  拿回去好好看看  以解决




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2