设计模式学习十五:代理模式

一.概念

     代理模式:为对象提供一种代理,以控制这个对象的访问。

二.UML

  1. Subject:定义RealSubject和Proxy的共同接口,这样在任何使用RealSubject的地方都可以使用Proxy。
  2. RealSubject:定义Proxy所代表的实体。
  3. Proxy:代理类,保存一个实体对象的引用,代理委托实体做事。

三.实例分析

     在深圳这个神奇的国度里,最有钱的其实是那些房东。这还得感谢我们伟大的小 平同志。以前不值钱的房子,现在租客多了,原地随便盖个十几层,一年下来百来万是一点问题都没有的。房东是基本不出现的,整个租房,收钱都是别人在帮他搞,也就是我们说的房屋中介。

     Renter

扫描二维码关注公众号,回复: 712338 查看本文章
package com.zzy.proxy;

/**
 * 租客接口
 * @author eason
 *
 */
public interface Renter {
	//租房
	void rent();
	//收房租
	void getMoney();
}

    HouseOwner

package com.zzy.proxy;

/**
 * 房主
 * 真实对象
 * 被代理对象
 * @author eason
 *
 */
public class HouseOwner implements Renter{

	@Override
	public void getMoney() {
		System.out.println("收取房租100W");
	}

	@Override
	public void rent() {
		System.out.println("出租房屋一年");
	}

}

   Agency

package com.zzy.proxy;

/**
 * 房屋中介
 * 代理对象
 * @author eason
 *
 */
public class Agency implements Renter{
	
	private HouseOwner houseOwner;

	//客户端不需要HouseOwner实例
	//客户因为Agency就是HouseOwner
	public Agency() {
		this.houseOwner = new HouseOwner();
	}

	@Override
	public void getMoney() {
		houseOwner.getMoney();
	}

	@Override
	public void rent() {
		houseOwner.rent();
	}
	
}

    ProxyTest

package com.zzy.proxy;

/**
 * 测试类
 * @author eason
 *
 */
public class ProxyTest {

	public static void main(String[] args) {
		Agency agency = new Agency();
		
		agency.rent();
		agency.getMoney();
	}

}
 

四.使用场景及使用感受

  1. 必须记住的一句话是:代理模式是控制对RealSubject的访问。有那些情况我们需要控制对RealSubject的访问呢?RealSubject是远程对象(RMI),你根本访问不到;RealSubject创建开销大;RealSubject需要被保护等等。
  2. 上面演示的是一个最简单的,最直接的代理模式。真实世界里面的代理模式有很多种变体,这些变体都有一个共同点:都会将客户对主题的方法拦截下来。
  • 防火墙代理(Firewall Proxy):控制网络资源的访问,保护主题免于"坏客户"的侵害。
  • 智能引用代理(Smart Reference Proxy):当主题被引用时,就行额外的动作,例如计算一个对象被引用的次数。
  • 缓存代理(Caching Proxy):为开销大的运算结果提供暂时存储,它也允许多个客户共享结果,以减少计算或网络延迟。
  • 同步代理(Synchronization Proxy):在多线程的情况下提供安全的访问。
  • 复杂隐藏代理(Complexity Proxy):用来隐藏一个类的复杂集合的复杂度,并进行访问控制。有时候也称为外观代理(Facade Proxy)。区别外观代理模式和外观模式:外观代理模式归根到底还是代理模式,是代理模式就是为了控制访问,而外观模式只提供另外一组接口。
  • 写入时复制代理(Copy-On-Write Proxy):用来控制对象的复制,方法是延迟对象的复制,直到客户真的需要为止。

 

猜你喜欢

转载自zy19982004.iteye.com/blog/1508417