首页 > 代码库 > 设计模式之代理模式 (三)

设计模式之代理模式 (三)

代理模式也叫委托模式。
一、定义:
代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。这些额外的操作通常需要与实际对象进行通信。

      二、角色定义


抽象角色:声明真实对象和代理对象的共同接口; 

代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。 

真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。


三、分类:

          根据《Java与模式》书中对代理模式的分类,代理模式分为8种,这里将几种常见的、重要的列举如下:

  1. 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。比如:你可以将一个在世界某个角落一台机器通过代理假象成你局域网中的一部分。

  2. 虚拟(Virtual)代理:根据需要将一个资源消耗很大或者比较复杂的对象延迟的真正需要时才创建。比如:如果一个很大的图片,需要花费很长时间才能显示出来,那么当这个图片包含在文档中时,使用编辑器或浏览器打开这个文档,这个大图片可能就影响了文档的阅读,这时需要做个图片Proxy来代替真正的图片。

  3. 保护(Protect or Access)代理:控制对一个对象的访问权限。比如:在论坛中,不同的身份登陆,拥有的权限是不同的,使用代理模式可以控制权限(当然,使用别的方式也可以实现)。

  4. 智能引用(Smart Reference)代理:提供比对目标对象额外的服务。比如:纪录访问的流量(这是个再简单不过的例子),提供一些友情提示等等。 

  代理模式是一种比较有用的模式,从几个类的“小结构”到庞大系统的“大结构”都可以看到它的影子。


代码示例:


package com.open.design.proxy;

public class ProxyData
{
	
	//抽象角色:声明真实对象和代理对象的共同接口; 
	public interface IPost {
			void post();
	}

	//真实角色
	public static class RealPost implements IPost
	{
		public RealPost()
		{

		}
		
		@Override
		public void post() {
			System.out.println("---我要寄快递---");
		}
	}
	
	//代理角色
	public static class PostProxy implements IPost{
		
			private IPost mIPost;
			
			public PostProxy(IPost mIPost)
			{
				this.mIPost=mIPost;
			}
			
			@Override
			public void post() {
				System.out.println("---Hi,快递公司为您服务---");
				this.mIPost.post();
				System.out.println("---Hi,你的快递已经帮您寄出---");
			}
	}
	
	//代理角色2
	public static class PostProxy2 implements IPost{
		
			private IPost mIPost;
			
			public PostProxy2()
			{
				this.mIPost=new RealPost();
			}
			
			@Override
			public void post() {
				System.out.println("---Hi,快递公司2 为您服务---");
				this.mIPost.post();
				System.out.println("---Hi,你的快递2 已经帮您寄出---");
			}
	}
}


测试类如下:


package com.open.design.proxy;

import com.open.design.proxy.ProxyData.PostProxy;
import com.open.design.proxy.ProxyData.PostProxy2;
import com.open.design.proxy.ProxyData.RealPost;

public class ProxyTest {

	public static void main(String[] args) {
		//不需要执行额外方法的
		RealPost mPost=new RealPost();
		mPost.post();
		
		System.out.println();
		System.out.println("--------------A---------------");
		System.out.println();
		
		//需要执行额外方法的
		PostProxy mPostProxy=new PostProxy(mPost);
		mPostProxy.post();
		
		System.out.println();
		System.out.println("--------------B---------------");
		System.out.println();
		
		//需要执行额外方法的
		PostProxy2 mPostProxy2=new PostProxy2();
		mPostProxy2.post();
	}

}

输出结果如下:





引用文章:http://www.yesky.com/412/1919412.shtml

          http://baike.baidu.com/view/2646301.htm?fr=aladdin