设计模式学习笔记(二) 代理模式

本文通过房地产代理的实例,详细解析了代理模式的概念与应用场景,并通过Java代码展示了如何实现代理模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



  代理模式(结构模式),“代理”就是受当事人委托;代表他进行某种活动;如诉讼、纳税、签订合同等。这当事人可以是一个人,一个单位或一个组织。现在代理这个词应该不陌生,代理商,代理公司,代理人。。。。。。

  举个例子,拿房地产代理来说吧。卖房子的人要卖房子,但是他一般不会自己去找买房子的人,为什么捏?原因很多,可能是找不到买房的人,可能是自己很忙,没时间去找。总之自己找很烦,于是他就找了房产代理公司,然后说明自己的条件,房地代理公司根据房主的条件去找买房的人,找到之后并不是直接带给卖方,而是要先看房,跟买方谈条件,如果代理和买方觉得条件都满足,好,代理领他去见卖方完成交易。

  这就是典型的代理的例子,UML图中,上面说到的卖方在就是RealSubject面代理公司是Proxy,买方自然就是Client,他们是通过一件事情联系在一起的,买卖房屋,也就是那个Subject接口。

  为什么要使用Proxy呢?引用jdon论坛老大BanQ的文章中的一段:

  1.授权机制 不同级别的用户对同一对象拥有不同的访问权利,如Jive论坛系统中,就使用Proxy进行授权机制控制,访问   论坛有两种人:注册用户和游客(未注册用户),Jive中就通过类似ForumProxy这样的代理来控制这两种用户对论坛的访问权限. (注:也就是说卖方不会去见所有要买房子的人,因为有些人可能不符合条件)

  2.某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动.
举例两个具体情况:
  (1)如果那个对象是一个是很大的图片,需要花费很长时间才能显示出来,那么当这个图片包含在文档中时,使用编辑器或浏览器打开这个文档,打开文档必须很迅速,不能等待大图片处理完成,这时需要做个图片Proxy来代替真正的图片.

  (2)如果那个对象在Internet的某个远端服务器上,直接操作这个对象因为网络速度原因可能比较慢,那我们可以先用Proxy来代替那个对象.
  (注:提高效率,让代理公司在后面去忙吧,我还可以做我自己的事情)

这就是使用Proxy的原因。

  

 确立功能

package dcr.study.dp.proxy;

public interface ISaleHouse {
	void findBuyer();//找买方
	void negotiation();//谈判
	void complete();//成交
}

 

 

 2实现功能

package dcr.study.dp.proxy;

public class RealSaleHouse implements ISaleHouse {

	public void complete() {
		System.out.println("与买方成交");
	}

	public void findBuyer() {
		System.out.println("找买家");
	}

	public void negotiation() {
		System.out.println("带买家看房,谈价格");
	}

}

 3建立代理

package dcr.study.dp.proxy;

/*
 * 这个类里面并没有真正的实现findBuyer,complete和negotiation
 * 而是在一些条件满足后,找到实际程序去完成这些操作。
 * 比如,你可以把权限的验证放在这里
 */
public class SaleHouseProxy implements ISaleHouse {
	private ISaleHouse saleHouse;
	
	//这里,一个代理公司不会只代理一个房子,你想买哪个
	//房子随你选,所以在构造里,我们可以选择我们要看的
	//实际的房子
	public SaleHouseProxy(ISaleHouse sh){
		this.saleHouse = sh;
	}
	
	public void complete() {
		//一些成交的条件如果满足,则找卖方完成交易
		this.saleHouse.complete();
	}

	public void findBuyer() {
		this.saleHouse.complete();
	}

	public void negotiation() {
		//帮助卖方去谈一些条件
		this.saleHouse.negotiation();
	}

}

 4调用

package dcr.study.dp.proxy;

public class Application {

	public static void main(String[] args) {
		//这里如果传入别的ISaleHouse的实现,就实现选择不同的房子
		ISaleHouse sh = 
			new SaleHouseProxy(new RealSaleHouse());
		
		sh.findBuyer();
		sh.negotiation();
		sh.complete();
	}

}

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值