zoukankan      html  css  js  c++  java
  • 设计模式【装饰模式】

    装饰模式(Decorator Pattern)
            又名包装(Wrapper)模式,装饰模式以对client透明的方式扩展对象的功能,是继承关系的一个替代方案。
     装饰模式以对client透明的方式动态的给一个对象附加上很多其它的责任。

    换言之,client并不会认为对象在装饰前和装饰后有什么差别。

    【转载使用,请注明出处:http://blog.csdn.net/mahoking
           装饰模式的特点是,在不创建很多其它子类的模式下,将对象的功能加以扩展。
           以下我们介绍,装饰模式与类继承的差别:

           1、 装饰模式是一种动态行为,对已经存在的类进行任意组合,而类的继承是一种静态的行为,一个类定义成什么样的,该类的对象便具有什么样的功能,无法动态的改变。


           2、 装饰模式扩展的是对象的功能,不须要添加类的数量,而类继承是扩展类的功能。在继承的关系中,比如。添加某个对象的功能,会通过继承的方式。在子类中添加须要的函数(方法)。


           3、 装饰模式是在不改变原类文件和使用继承的情况下,动态的扩展一个对象的功能,它是通过创建一个包装对象。也就是装饰包裹真实的对象。
    装饰模式把对client的调用委派给被装饰的类,装饰模式的关键在于这样的扩展全然透明的。以下介绍装饰模式的构成。

    装饰模式的构成:
           1、抽象构建角色(Component),给出一个抽象的接口,以规范准备接受附加责任的对象。

    比如:i/o流里面InputStream/OutputStream和Reader/Writer。
           2、详细的构建角色(ConcreteComponent),定义一个将要接受附加责任的类。比如:i/o里面的FileOutputStream和FileInputStream。
          3、装饰角色(Docotator),持有一个抽象构建(Component)角色的引用,并定义一个与抽象构建一致的接口。比如:i/o里面的FilerOutputStream和FilterInputStream。


          4、详细的装饰角色(ConcreteDecorator),负责给构建对象“贴上”附加的责任。比如:i/o流里面的BufferedOutputStream和BufferedInputStream以及DataOutputStream和DataInputSrtream。
     

    装饰模式的特点:
         1、装饰对象和真实对象具有同样的接口。这样client对象就能够以真实的对象的同样方式和装饰对象交互。
         2、装饰对象包括一个真实对象的应用(reference)。


         3、装饰对象接受全部来自client的请求。它把这些请求转发个真实的对象。
         4、装饰对象能够在转发这些请求曾经或者以后添加一些附加的功能。这样就能确保在执行时。不用改动给定对象结构就能够在外部添加附加的功能。

    在面向对象的程序设计中。一般是使用继承的关心来扩展给指定类的功能。


    演示样例案例

    /**
     * 抽象构建角色
     * @author Mahc
     *
     */
    public interface Component {
    
    	/**
    	 * 某项功能的操作
    	 */
    	public void function();
    }
    
    /**
     * 详细的构建角色
     * @author Mahc
     *
     */
    public class ConcreteComponent implements Component{
    
    	@Override
    	public void function() {
    
    		System.out.println("Function A");
    	}
    
    }
    
    /**
     * 装饰角色
     * @author Mahc
     *
     */
    public class Decorate implements Component {
    
    	private Component component;
    	
    	public Decorate(Component component) {
    		this.component = component;
    	}
    
    	@Override
    	public void function() {
    		
    		component.function();
    	}
    
    }
    
    /**
     * 详细的装饰角色
     * @author Mahc
     *
     */
    public class ConcreteDecorator extends Decorate{
    
    	public ConcreteDecorator(Component component) {
    		super(component);
    	}
    	
    	@Override
    	public void function() {
    		super.function();
    		this.otherFunction();
    	}
    	
    	private void otherFunction(){
    		System.out.println("otherFunction B");
    	}
    }
    
    /**
     * 装饰模式測试用例
     * @author Mahc
     *
     */
    public class TestDecoratorPattern {
    
    	public static void main(String[] args) {
    		
    		ConcreteComponent component = new ConcreteComponent();
    		ConcreteDecorator decorator = new ConcreteDecorator(component);
    		System.out.println("真实对象(类)调用function()");
    		component.function();
    		System.out.println("包装对象(类)调用function()");
    		decorator.function();
    	}
    }


     【转载使用,请注明出处:http://blog.csdn.net/mahoking

  • 相关阅读:
    tomcat虚拟机配置
    日期时分秒毫秒+3位随机数
    springmvc action访问路径不带项目名
    nginx 配置模板
    AES加密
    spring-mvc里的 <mvc:resources> 及静态资源访问
    MySQL——事务(Transaction)
    mysql索引
    < aop:aspect>与< aop:advisor>的区别
    annotation-driven
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6751616.html
Copyright © 2011-2022 走看看