zoukankan      html  css  js  c++  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();  
        }  
    }  

     转自:http://hovertree.com/h/bjaf/zhuangshi.htm

    推荐:http://www.cnblogs.com/roucheng/p/chengxuyuan.html

  • 相关阅读:
    Android x86 镜像分析之四
    Android x86 镜像分析之三
    Android x86 镜像分析之二
    Android x86镜像分析
    tizen镜像制作
    完成登录与注册页面的前端
    JavaScript 基础,登录前端验证
    CSS实例:图片导航块
    导航,头部,CSS基础
    web基础,用html元素制作web页面
  • 原文地址:https://www.cnblogs.com/roucheng/p/zhuangshi.html
Copyright © 2011-2022 走看看