代理模式 - 结构型模式
来源:互联网 发布:阿里云服务器搭建云免 编辑:程序博客网 时间:2024/05/21 19:25
个人理解:
概述:
对其他对象提供一种代理以控制对这个对象的访问。(Provide a surrogate or placeholder for another object to control access to it)。代理模式也叫做委托模式。
使用代理模式创建代理对象,让代理对象控制目标对象的访问(目标对象可以是远程的对象、创建开销大的对象或需要安全控制的对象),并且可以在不改变目标对象的情况下添加一些额外的功能。
角色:
抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。
目标对象角色:定义了代理对象所代表的目标对象。
代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。
代理模式的应用场景
结构图:
代理模式的优缺点
由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
与其他相关模式
代理则控制对对象的访问;装饰者为对象添加一个或多个功能;适配器为它所适配的对象提供了一个不同的接口
1)适配器模式Adapter: 适配器Adapter 为它所适配的对象提供了一个不同的接口。相反,代理提供了与它的实体相同的接口。然而,用于访问保护的代理可能会拒绝执行实体会执行的操作,因此,它的接口实际上可能只是实体接口的一个子集。
2) 装饰器模式Decorator: 尽管Decorator的实现部分与代理相似,但Decorator的目的不一样。Decorator为对象添加一个或多个功能,而代理则控制对对象的访问。
代理模式的应用实例
现实中,Proxy应用范围很广,现在流行的分布计算方式RMI和Corba等都是Proxy模式的应用。Spring AOP 日志等操作。
Struts2的Form元素映射就采用了代理模式(准确的说是动态代理模式)[待考证]
代码(其实读UML图要比代码还要一目了然)
动态代理
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:InvocationHandler(Interface)、Proxy。在使用动态代理类时,我们必须实现InvocationHandler接口。
运行结果:
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
补充模式:空对象模式
参考/转自
http://blog.csdn.net/jianghuxiaoxiami/article/details/3403924
http://www.cnblogs.com/cbf4life/archive/2010/01/27/1657438.html
http://blog.csdn.net/jackiehff/article/details/8621517
转载请注明:http://blog.csdn.net/paincupid/article/details/43926757
模式类型:
Proxy 代理模式 - 结构型模式
概述:
对其他对象提供一种代理以控制对这个对象的访问。(Provide a surrogate or placeholder for another object to control access to it)。代理模式也叫做委托模式。
使用代理模式创建代理对象,让代理对象控制目标对象的访问(目标对象可以是远程的对象、创建开销大的对象或需要安全控制的对象),并且可以在不改变目标对象的情况下添加一些额外的功能。
角色:
抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。
目标对象角色:定义了代理对象所代表的目标对象。
代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。
代理模式的应用场景
结构图:
代理模式的优缺点
由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
与其他相关模式
代理则控制对对象的访问;装饰者为对象添加一个或多个功能;适配器为它所适配的对象提供了一个不同的接口
1)适配器模式Adapter: 适配器Adapter 为它所适配的对象提供了一个不同的接口。相反,代理提供了与它的实体相同的接口。然而,用于访问保护的代理可能会拒绝执行实体会执行的操作,因此,它的接口实际上可能只是实体接口的一个子集。
2) 装饰器模式Decorator: 尽管Decorator的实现部分与代理相似,但Decorator的目的不一样。Decorator为对象添加一个或多个功能,而代理则控制对对象的访问。
代理模式的应用实例
现实中,Proxy应用范围很广,现在流行的分布计算方式RMI和Corba等都是Proxy模式的应用。Spring AOP 日志等操作。
Struts2的Form元素映射就采用了代理模式(准确的说是动态代理模式)[待考证]
代码(其实读UML图要比代码还要一目了然)
//抽象角色:abstract public class Subject{ abstract public void request();}//真实角色:实现了Subject的request()方法。public class RealSubject extends Subject{ public RealSubject(){ } public void request(){ System.out.println("From real subject."); }}//代理角色:public class ProxySubject extends Subject{ private RealSubject realSubject; //以真实角色作为代理角色的属性 public ProxySubject(){ } public void request(){ //该方法封装了真实对象的request方法 preRequest(); if( realSubject == null ){ realSubject = new RealSubject(); } realSubject.request(); //此处执行真实对象的request方法 postRequest(); } private void preRequest(){ //something you want to do before requesting } private void postRequest(){ //something you want to do after requesting }}//客户端调用:Subject sub=new ProxySubject();Sub.request();
动态代理
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:InvocationHandler(Interface)、Proxy。在使用动态代理类时,我们必须实现InvocationHandler接口。
被代理的对象(RealSubject)可以在运行时动态改变,需要控制的接口(Subject接口)可以在运行时改变,控制的方式(DynamicSubject类)也可以动态改变,从而实现了非常灵活的动态代理关系。
动态代理代码package com.lee;public interface Subject {public void request();}
package com.lee;public class RealSubject implements Subject{ public RealSubject(){ } public void request(){ System.out.println("From real subject."); }}
package com.lee;import java.lang.reflect.Method;import java.lang.reflect.InvocationHandler;public class DynamicSubject implements InvocationHandler{ private Object sub; public DynamicSubject(Object sub){ this.sub = sub; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before calling " + method); method.invoke(sub,args); System.out.println("after calling " + method); return null; }}
package com.lee;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;import java.lang.reflect.Constructor;import java.lang.reflect.Method;public class Client {static public void main(String[] args) throws Throwable {RealSubject rs = new RealSubject(); // 在这里指定被代理类InvocationHandler ds = new DynamicSubject(rs); // 初始化代理类Class cls = rs.getClass();Subject subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), ds);subject.request();}}
运行结果:
before calling public abstract void com.lee.Subject.request()
From real subject.
after calling public abstract void com.lee.Subject.request()
所有模式
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
补充模式:空对象模式
参考/转自
http://blog.csdn.net/jianghuxiaoxiami/article/details/3403924
http://www.cnblogs.com/cbf4life/archive/2010/01/27/1657438.html
http://blog.csdn.net/jackiehff/article/details/8621517
转载请注明:http://blog.csdn.net/paincupid/article/details/43926757
0 0
- 结构型模式-代理模式
- 代理模式 - 结构型模式
- 结构型模式-代理模式
- 结构型模式:代理模式
- 结构型模式-代理模式
- 结构型-代理模式
- 结构型模式-代理
- 设计模式 - 结构型模式 - 代理模式
- 设计模式->结构型模式->代理模式
- 结构模式->代理模式
- Proxy代理(结构型模式)
- 【结构型模式】proxy(代理)
- 代理模式(结构型)
- 代理模式(结构型)
- 10-结构型-代理模式
- 结构型之代理模式
- 结构型模式-代理(proxy)
- 结构型-代理模式(proxy)
- Eratosthenes筛法和Euler筛法
- 创业公司是如何进行研发管理和绩效考核的?从豌豆荚说开去
- C++构造数据类型----引用
- 64位Windows7使用VS2010编译wxWidgets
- sybase ASA 数据库的表碎片 整理
- 代理模式 - 结构型模式
- 关于组合游戏
- POJ 题目3041 Asteroids(二分图)
- .Net单元测试(二)——XML数据载体的优势与实际应用
- 大数据技术趋势以及未来方向
- 日经社説 20150224 訪日客の多様化に応じた通訳ガイド育め
- poj 2458 Rigging the Bovine Election
- 超低功耗物联网
- 社説 20150224 与那国住民投票 国防を地方政争の具にするな