`
java苹果+番茄
  • 浏览: 65754 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

代理(Proxy)模式 【结构模式第一篇】

阅读更多
代理(Proxy)模式
是对象的结构模式,代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。

一、代理的种类:
如果按照使用目的来划分,代理有以下几种:
1、远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,
   也可以在另一台机器中。远程代理又叫做大使(Ambassador)。
2、虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。
3、Copy-on-Write代理:虚拟代理的一种,把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。
4、保护(Protect or Access)代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。
5、Cache(高速缓存)代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
6、防火墙(Firewall)代理:保护目标,不让恶意用户接近。
7、同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。
8、智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来。
二、代理模式的结构:
代理模式所涉及的角色有:
1、抽象主题角色:声明了真实主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方都可以使用代理主题

2、代理主题角色:代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象;
   代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以替代真实主体;
   控制对真实主题的引用,负责在需要的时候创建真实主题对象(和删除真实主题对象);
   代理角色通常在将客户端调用传递给真实的主题之前或者之后,都要执行某个操作,而不是单纯地将调用传递给真实主题对象

3、真实主题角色:定义了代理角色所代表的真实对象。
//抽象主题角色
			public abstract class Subject{
				public abstract void 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(){
					preRequest();
					if(realSubject == null){
						realSubject = new RealSubject();
					}
					realSubject.request();
					postRequest();
				}
				
				private void preRequest(){
					//..................
				}
				
				private void postRequest(){
					//....................
				}
			}
			
			//VectorProxy
			import java.lang.reflect.InvocationHandler;
			import java.lang.reflect.Proxy;
			import java.lang.reflect.Method;
			import java.util.Vector;
			import java.util.List;
			
			public class VectorProxy implements InvocationHandler{
				private Object proxyobj;
				
				public VectorProxy(Object obj){
					proxyobj = obj;
				}
				
				//静态工厂方法
				public static Object factory(Object obj){
					Class cls = obj.getClass();
					return cls.getClassLoader();
					cls.getInterface(new VectoryProxy(obj));
				}
				
				public Object invoke(Object proxy, Method method, Object[] args)throws Throwable{
					System.out.println("before calling" + method);
					if(args != null){
						for(int i = 0; i < args.length; i ++){
							System.out.println(args[i] + " ");
						}
					}
					Object o = method.invoke(proxyobj,args);
					System.out.println("after calling" + method);
					return o;
				}
				
				public static void main(String args[]){
					List v = null;
					v = (List)factory(new Vector(10));
					v.add("New");
					v.add("York");
				}
			}
			


三、代理模式的优、缺点
1、优点
1-远程代理)优点是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。
   客户完全可以认为代理的对象是局域的而不是远程的,而代理对象承担了大部分的网络通信工作。
 
2-虚拟代理)优点是代理对象可以在必要的时候才将被代理的对象加载。
   代理可以对加载的过程加以必要的优化。当一个模块的加载十分耗费资源的时候,虚拟代理的优点就非常明显。

3-保护代理)优点是它可以在运行的时间对用户的有关权限进行检查,然后在核实后决定将被调用传递给被代理的对象。

4-智能引用代理)在访问一个对象时可以执行一些内务处理操作。
//一个实例
	//此实例调用的次序是:
		1、客户端调用代理对象
		2、代理对象调用AccessValidator对象,确定用户确实具有相应的权限
		3、代理对象调用RealSearcher对象,完成查询功能
		4、代理对象调用UsageLogger对象,完成计数功能
		5、代理对象将RealSearcher对象的查询结果返回给客户端。
	//客户端
	public class Client{
		//声明一个静态类型为Searcher的静态变量
		private static Searcher searcher;
		
		public static void main(String args[]){
			//此静态变量的真实类型为Proxy
			searcher = new Proxy();
			String userId = "Admin";
			String searchType = "SEARCH_BY_ACCOUNT_NUMBER";
			String result = searcher.doSearch(userId,searchType);
			System.out.println(result);
		}
	}
	
	//抽象主题角色
	public interface Searcher{
		String doSearch(String userId,String searchType);
	}
	
	//代理角色
	public class Proxy implements Searcher{
		private RealSearcher searcher;
		private UsageLogger usageLogger;
		private AccessValidator accessValidator;
		
		public Proxy(){
			searcher = new RealSearcher(); 
		}
		
		public String doSearch(String userId, String keyValue){
			if(checkAccess(userId)){
				String result = searcher.doSearch(null,keyValue);
				logUsage(userId);
				return result;
			}else{
				return null;
			}
		}
		
		public boolean checkAccess(String userId){
			accessValidator = new AccessValidator();
			return accessValidator.validateUser(userId);
		}
		
		private void logUsage(String userId){
			UsageLogger logger = new UsageLogger();
			logger.setUserId(userId);
			logger.save();
		}
	}
	
	//真实主题
	public class RealSearcher implements Searcher{
		public RealSearcher(){}
		
		//真实的查询工作在这里进行
		public String doSearch(String userId,String keyValue){
			String sql = "select * from data_table where key_col = '" + keyValue + "'";
			//execute SQL Statement
			//concatenate a result String
			return "result set";
		}
	}
	
	//检查权限的对象
	public class AccessValidator{
		//用户检查发生在这里
		public boolean validatorUser(String userId){
			if(userId.equals("Admin")){
				return true;
			}else{
				false;
			}
		}
	}
	
	//记录次数
	public class UsageLogger{
		private String userId;
		
		public void setUserId(String userId){
			this.userId = userId;
		}
		
		public void save(){
			String sql = "insert into usage_table(user_id)" + "values(" + userId + ")";
			//execute sql
		}
		
		public void save(*String userId){
			this.userId = userId;
			save();
		}
	}
		
分享到:
评论
1 楼 zxmsdyz 2009-10-26  
public void 

相关推荐

    C#面向对象设计模式纵横谈\13 结构型模式Proxy代理模式.zip

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要资源... 这是第13节:结构型模式Proxy代理模式

    Delphi模式编程第一分卷

    一共两个压缩分卷,这是第一个分卷 第一部分 模式编程原理 第1章 模式概述 1.1 模式的概念 1.1.1 什么是模式 1.1.2 模式可以做什么 1.2 模式与架构 1.2.1 什么是架构 1.2.2 架构和模式的关系 1.3 从面向...

    Delphi模式编程第二分卷

    第一部分 模式编程原理 第1章 模式概述 1.1 模式的概念 1.1.1 什么是模式 1.1.2 模式可以做什么 1.2 模式与架构 1.2.1 什么是架构 1.2.2 架构和模式的关系 1.3 从面向对象编程到模式编程 1.3.1 ...

    研磨设计模式(完整带书签).part2.pdf

    第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器...

    研磨设计模式(完整带书签).part1.pdf

    第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器...

    设计模式可复用面向对象软件的基础.zip

    第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 ...

    设计模式--C++

    4.7 Proxy(代理)—对象结构型模式 137 4.8 结构型模式的讨论 144 4.8.1 Adapter 与 Bridge 144 4.8.2 Composite、 Decorator 与 Proxy 145 第 5 章 行为模式 147 5.1 CHAIN OF RESPONSIBIL ITY(职责链)—对象...

    07-使用代理快速接入第三方库(1).html

    代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite ) 享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( Template Method ) 观察者模式( ...

    《设计模式》中文版(23个设计模式的介绍与运用)

    第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 ...

    设计模式(.PDF)

    第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 ...

    GOLF设计模式(C++语言版)

    第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的...

    Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides23种设计模式

    第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 ...

    《国外写的,翻译版本》设计模式

    第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 ...

    设计模式 GOF 23

    4.7 Proxy(代理)—对象结构型 模式 137 4.8 结构型模式的讨论 144 4.8.1 Adapter与Bridge 144 4.8.2 Composite、Decorator与Proxy 145 第5章 行为模式 147 5.1 CHAIN OF RESPONSIBIL ITY(职责链) —对象行为型...

    设计模式part1

    录 序言 前言 读者指南 第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计...

    设计模式:可复用面向对象软件的基础--详细书签版

    4.7 proxy(代理)—对象结构型 模式 137 4.8 结构型模式的讨论 144 4.8.1 adapter与bridge 144 4.8.2 composite、decorator与proxy 145 第5章 行为模式 147 5.1 chain of responsibil ity(职责链) —对象...

    研磨设计模式.part1(共4个)

    第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章...

    研磨设计模式-part2

    第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器...

    研磨设计模式-part4

    第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器...

    研磨设计模式-part3

    第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器...

Global site tag (gtag.js) - Google Analytics