zoukankan      html  css  js  c++  java
  • 装饰器模式

    装饰器模式

    意图:动态地给一个对象添加一些额外的职责,就增加功能来说,Decorator模式相比生成子类更加灵活;

    动机:我们希望给某个对象添加而不是整个类添加一些功能;

    下面看个例子:

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

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

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

    3.下面是三个装饰器的实现:

    package com.google;
    /** 
     *身份:装饰器 
     *为原来的类添加新的功能 
    */  
    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 com.google;
      
    /** 
     *身份:装饰器 
    */  
    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 com.google;  
      
    /** 
     *身份:装饰器 
    */  
    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");  
        }  
    }

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

    /* 
     * 设计模式:装饰器模式 
     * java 简单的演示 
    */  
    package com.google;  

    import uni.pattern.decorator.Original;  
    import uni.pattern.decorator.*;  
      
    public class DecoratorPattern {  
        public static void main(String[] args) {  
            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

  • 相关阅读:
    【基础】Attribute的妙用
    【翻译】.Net Core的意义
    【基础】迭代器详解
    【总结】数据库索引的实现原理
    【实践】基于接口的插件机制
    【总结】设计模式应用之单例模式
    【基础】多线程更新窗体UI的若干方法
    【基础】MVC路由规则
    Mybatis 分页:Pagehelper + 拦截器实现
    这四种对象属性拷贝方式,你都知道吗?
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3331124.html
Copyright © 2011-2022 走看看