装饰器模式

作者: 激情的狼王 | 来源:发表于2017-11-08 15:09 被阅读0次

    定义:装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

                 这一个解释,引自百度百科,我们注意其中的几点。
    
                 1,不改变原类文件。
    
                 2,不使用继承。
    
                 3,动态扩展。
    

    实例:

    package uni.pattern.decorator;  
    /* 
     * 创建一个对象的抽象也就是接口 
    */  
    public interface Basket {  
        public void show();  
          
    }
    

    下面是被装饰的对象,也就是对接口的一个实现,注意可以有多个实现

    package uni.pattern.decorator;  
      
    /** 
     *身份:被装饰的对象 
     *一个对接口的实现,这个对象表示要我们将来要修饰的篮子里装内容,如果想修饰篮子的造型,还可以创建其他类实现Basket的接口,比如Shape 
     * 不理解的话可以查看java语言的接口抽象机制 
    */  
    public class Original implements Basket{  
        public void show(){  
          System.out.println("The original Basket contains");  
        }  
    }
    

    接下来是三个装饰器的实现

    package uni.pattern.decorator;  
      
    /** 
     *身份:装饰器 
     *为原来的类添加新的功能 
    */  
    public class AppleDecorator implements Basket{  
        private Basket basket;  
        public AppleDecorator( Basket basket){  
          super();  
          this.basket = basket;  
        }  
          
        public void show(){  
          basket.show();  
          System.out.println("An Apple");  
        }  
          
    }
    
    package uni.pattern.decorator;  
      
    /** 
     *身份:装饰器 
    */  
    public class BananaDecorator implements Basket{  
        private Basket basket;  
        public BananaDecorator(Basket basket){  
            super();  
            this.basket = basket;  
        }  
          
        public void show(){  
            basket.show();  
            System.out.println("A Banana");  
        }  
          
    }
    
    package uni.pattern.decorator;  
      
    /** 
     *身份:装饰器 
    */  
    public class OrangeDecorator implements Basket{  
        private Basket basket;  
        public OrangeDecorator(Basket basket){  
            super();  
            this.basket = basket;  
        }  
          
        public void show(){  
            basket.show();  
            System.out.println("An Oranage");  
        }  
          
    }
    

    最后就是实现的效果,我们三个修饰器全部用到,装满了篮子,当然也可以只装一个苹果或香蕉

    /* 
     * 设计模式:装饰器模式 
     * java 简单的演示 
    */  
    package decoratorpattern;  
    import uni.pattern.decorator.Original;  
    import uni.pattern.decorator.*;  
      
    /** 
     * 
     * @author octobershiner 
     * 2011 7 25 
     * SE.HIT 
    */  
    public class DecoratorPattern {  
      
        /** 
         * @param args the command line arguments 
    */  
        public static void main(String[] args) {  
            // TODO code application logic here  
            Basket basket = new Original();  
            //一个装饰的过程  
            Basket myBasket =new AppleDecorator(new BananaDecorator(new OrangeDecorator(basket)));   
            myBasket.show();  
        }  
    }
    

    演示的结果:

    run:
    The original Basket contains
    An Oranage
    A Banana
    an Apple
    

    成功生成(总时间:0 秒)
    装饰器的优点

    1、装饰者模式可以提供比继承更多的灵活性
    2、可以通过一种动态的方式来扩展一个对象的功能,在运行时选择不同的装饰器,从而实现不同的行为。
    3、通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。可以使用多个具体装饰类来装饰同一对象,得到功能更为强大的对象。
    4、具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,在使用时再对其进行组合,原有代码无须改变,符合“开闭原则”。

    缺点

    1、会产生很多的小对象,增加了系统的复杂性
    2、这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。

    相关文章

      网友评论

        本文标题:装饰器模式

        本文链接:https://www.haomeiwen.com/subject/vyzemxtx.html