装饰器模式和代理模式的区别

转载自 装饰器模式和代理模式的区别

 学习AOP时,教材上面都说使用的是动态代理,可是在印象中代理模式一直都是控制访问什么的,怎么又动态增加行为了,动态增加行为不是装饰器模式吗?于是找了很多资料,想弄清楚这两者之间到底有什么区别。结果发现这一篇英文文章讲的很清晰,就翻译一下,供参考。       

        首先,让我们先看一下下面的这两个UML类图,他们分别描述了装饰器模式和代理模式的基本实现。



        这两个图可能使我们产生困惑。这两个设计模式看起来很像。对装饰器模式来说,装饰者(decorator)和被装饰者(decoratee)都实现同一个接口。对代理模式来说,代理类(proxy class)和真实处理的类(real class)都实现同一个接口。此外,不论我们使用哪一个模式,都可以很容易地在真实对象的方法前面或者后面加上自定义的方法。

        然而,实际上,在装饰器模式和代理模式之间还是有很多差别的。装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。

        我们可以用另外一句话来总结这些差别:使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。       

[java] view plain copy
  1. //代理模式  
  2. public class Proxy implements Subject{  
  3.   
  4.        private Subject subject;  
  5.        public Proxy(){  
  6.              //关系在编译时确定  
  7.             subject = new RealSubject();  
  8.        }  
  9.        public void doAction(){  
  10.              ….  
  11.              subject.doAction();  
  12.              ….  
  13.        }  
  14. }  

[java] view plain copy
  1. //代理的客户  
  2. public class Client{  
  3.         public static void main(String[] args){  
  4.              //客户不知道代理委托了另一个对象  
  5.              Subject subject = new Proxy();  
  6.              …  
  7.         }  
  8. }  

[java] view plain copy
  1. //装饰器模式  
  2. public class Decorator implements Component{  
  3.         private Component component;  
  4.         public Decorator(Component component){  
  5.             this.component = component  
  6.         }  
  7.        public void operation(){  
  8.             ….  
  9.             component.operation();  
  10.             ….  
  11.        }  
  12. }  
[java] view plain copy
  1. //装饰器的客户  
  2. public class Client{  
  3.         public static void main(String[] args){  
  4.             //客户指定了装饰者需要装饰的是哪一个类  
  5.             Component component = new Decorator(new ConcreteComponent());  
  6.             …  
  7.         }  
  8. }  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Java 8 Stream像操作SQL一样处理数据(上)

转载自 使用Java 8 Stream像操作SQL一样处理数据(上) 几乎每个Java应用都要创建和处理集合。集合对于很多编程任务来说是一个很基本的需求。举个例子,在银行交易系统中你需要创建一个集合来存储用户的交易请求,然后你需要遍历整个…

tomcat(19)Manager应用程序的servlet类

【0】README1)本文部分文字描述转自:“深入剖析tomcat”,旨在学习“tomcat(19)Manager应用程序的servlet类” 的相关知识;2)Manager应用程序用来管理已经部署的web 应用程序;在tomcat7中,manage…

使用Java 8 Stream像操作SQL一样处理数据(下)

转载自 使用Java 8 Stream像操作SQL一样处理数据(下) 在上一篇文章中,我们介绍了Stream可以像操作数据库一样来操作集合,但是我们没有介绍 flatMap 和 collect 操作。这两种操作对实现复杂的查询是非常有用的。比如你可以结果 fl…

spring(4)面向切面的Spring(AOP)

【0】README1)本文部分文字描述转自:“Spring In Action(中/英文版)”,旨在review “spring(4)面向切面的Spring(AOP)”的相关知识;2)在软件开发中,散布于应…

Mybatis-plus 思维导图,让 Mybatis-plus 不再难懂

转载自 Mybatis-plus 思维导图,让 Mybatis-plus 不再难懂 摘要: Mybatis-Plus(简称MP)是一个Mybatis的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。mybatis-plus与mybatis mybatis Mybat…

报错:The type javax.servlet.http.HttpServletRequest cannot be resolved

【0】README 0.1)以下内容转自: http://blog.csdn.net/vincent080928/article/details/5392891 problem)The type javax.servlet.http.HttpServletRequest cannot be resolved. It is indirectly referenced from required .class files. 这…

MyBatis 思维导图,让 MyBatis 不再难懂(一)

转载自 MyBatis 思维导图,让 MyBatis 不再难懂(一)写在前面与hibernate相比,我无疑更喜欢mybatis,就因为我觉得它真的好用,哈哈。它简单上手和掌握;sql语句和代码分开,方便统一管理和…

tomcat(20)基于JMX的管理

【0】README1)本文部分文字描述转自:“深入剖析tomcat”,旨在学习“tomcat(20)基于JMX的管理” 的相关知识;2)晚辈我在tomcat上部署web 项目以测试JMX管理 tomcat 容器bean的效果,结果运行不成功&#xff0…

mybatis思维导图,让mybatis不再难懂(二)

转载自 mybatis思维导图,让mybatis不再难懂(二) 写在前面 上一篇文章写了mybatis的基本原理和配置文件的基本使用,这一篇写mybatis的使用,主要包括与sping集成、动态sql、还有mapper的xml文件一下复杂配置等。值得注意…

spring(5)构建 spring web 应用程序

【0】README1)本文部分文字描述转自:“Spring In Action(中/英文版)”,旨在review “spring(5)构建 spring web 应用程序” 的相关知识;【1】spring mvc 起步【1.1】跟踪spring mvc的请求1)请求…

Spring思维导图,让Spring不再难懂(ioc篇)

转载自 Spring思维导图,让Spring不再难懂(ioc篇) 写过java的都知道:所有的对象都必须创建;或者说:使用对象之前必须先创建。而使用ioc之后,你就可以不再手动创建对象,而是从ioc容器中…

spring(6) 渲染web视图

【0】README1)本文部分文字描述转自:“Spring In Action(中/英文版)”,旨在review “spring(6) 渲染web视图” 的相关知识;【1】 理解视图解析【1.1】视图解析的基础知识以及spring 提供的其他视图解析器1…

Spring思维导图,让Spring不再难懂(aop篇)

转载自 Spring思维导图,让Spring不再难懂(aop篇) 什么是aop AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程&…

tomcatSupplement(1)tomcat启动脚本分析(以Windows平台为例)

【0】README1)本文部分文字描述转自:“深入剖析tomcat”,旨在学习“tomcat启动脚本分析” 的相关知识;2)for tomcat4 startup files, please visit https://github.com/pacosonTang/HowTomcatWorks/tree/ma…

Spring思维导图,让spring不再难懂(一)

转载自 Spring思维导图,让spring不再难懂(一) 摘要: Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE …

spring(7)spring mvc 的高级技术

【0】README1)本文部分文字描述转自:“Spring In Action(中/英文版)”,旨在review “spring(7)spring mvc 的高级技术” 的相关知识;2)本文将会看到如何编写控制器来处理文件上传,如…

Ubuntu下MySQL、Redis以及MongoDB三个数据库的启动、重启以及停止命令

一、MySQL #启动 /etc/init.d/mysql start #停止 /etc/init.d/mysql stop #重启 /etc/init.d/mysql restart 二、Redis #启动 redis-server #停止 pkill redis-server三、MongoDB #启动服务 sudo service mongod start #重启 sudo service mongod restart #终止 sudo serv…

Spring思维导图,让Spring不再难懂(mvc篇)

转载自 Spring思维导图,让Spring不再难懂(mvc篇)spring mvc简介与运行原理Spring的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的,这个Servlet会把请求分发给各个处理器,并支持…

spring(10)通过spring 和 JDBC征服数据库

【0】README1)本文部分文字描述转自:“Spring In Action(中/英文版)”,旨在review “spring(10)通过spring 和 JDBC征服数据库” 的相关知识;【1】 spring 的数据访问哲学1)intro:s…

Ubuntu下apt-get方式Git的安装、配置和更新

一、首先命令行下载Git sudo apt-get update sudo apt-get install git 通过此种方式安装的git可能不是官方的最新版本,通过 git --version 查看版本信息,然后与git官网比对官网下载地址 二、然后配置git的帐号信息 git config --global user.name &q…