大白话讲解设计模式之:代理模式 Java语言实现

代理模式的基本概念之类的我就不废话了,其他大神的博客中对这些东西写的非常清楚。而我这篇文章仅是靠我自己对代理模式的理解而设计的一个相对通俗的例子。写这篇例子的主要原因是因为发现其他大神博文中举的例子太晦涩难懂了,反正我当时看时是没有那种大脑中一道闪电划过,然后叫到:“哦,我懂了,原来是这样。”的感觉。因此希望通过这个例子能够给尚未掌握这块知识的朋友们提供一点点帮助。当然,我自己也刚毕业,对技术的掌握还很肤浅,文中的不周之处,还望海涵。

这个故事的背景是一个刚毕业的大学生在深圳租房子的故事,深圳租房界,真是中介泛滥。那这里就存在三种职业关系:1、刚毕业的大学生;2、中介;3、房东;那为了区分这几种职业,我们把它们抽象出来,只抽象学生和中介。


interface Proxy{
	
}

interface Student{
	
}
这个抽象纯粹就是为了区分这两种职业而已,并在下面会起到作用,所以没有写抽象方法了。
接下来再定义一个租房子的接口。这个接口房东、中介及学生都要实现,因为大家都要完成租房这件事。

/**
 * 定义一个租房接口类。抽象出租房子要涉及到的一些事情。
 * */
interface RentingHouse {
	float howMuch();
	// 其它...
}
好的。至此,这些基础的东西就都准备完毕了。那我们现在先来明确一下代理这个模式的模型。终极需求是毕业生需要找房东租一个房子,但是由于某些特殊原因,毕业生无法直接联系上房东,只能通过中介,问中介房子的信息,然后和中介签合同,把钱给中介,中介再把钱给房东。如下图:

模型清楚了,那再来设计房东类:

class HouseMaster implements RentingHouse {
	
	private float price = 800.0f;
	
	
	private static HouseMaster master = new HouseMaster();
	
	private HouseMaster(){
		
	}
	
	public static HouseMaster connectHouseMaster(Proxy proxy){  // 注释1
		return master;
	}

	@Override
	public float howMuch() {
		System.out.println("The price HouseMaster told to proxy:"+price);
		return price;
	}

}


这里解释一下为什么房东设计成单例模式。其实这是依据前面提到的模型而设计的:只有中介可以联系上房东。如果构造器不private。那么谁都可以直接“联系上”房东了,在这个例子里,中介就已经没有存在的必要了。所以房东只留下了唯一的“联系他”的方式:connectHouseMaster()方法。并且这个方法还需要“身份认证(参数)”。房东只接受中介的联系。如此,便符合先前设计的模型了。如果到这还不懂这个参数的作用,可以继续往下看。

接下来是代理类的设计:



class ProxyGuy implements RentingHouse, Proxy {

	HouseMaster master;
	
	{
		master = HouseMaster.connectHouseMaster(this); //注释1
	}

	@Override
	public float howMuch() {
		float price = master.howMuch();
		
		price += 200.0;
		
		return price;
	}
	
}
这个ProxyGut类除了实现最基本的租房接口外还实现了这个Proxy接口,这就相当于一张营业执照,表明他是被国家承认的合法的中介,是他的身份的象征。然后看注释1处,中介想要与房东取得联系,那真的是非常简单的事情,敲开房东家大门(HouseMaster.connectHouseMaster()),亮出你的身份证(this参数),房东认出你是中介,就给你开门了,然后有事就好商量了。接下来再看这个抽象方法howMuch()。当毕业生向中介询问价钱时,中介从房东口里实时得到报价之后主动权就已经掌握在中介的手里了,这个时候中介就可以在这个报价上面做文章了,最简单的就是他可以加价出售,从中赚取差价。所以代理类在程序设计中除了帮助其它类建立联系之外还有一个非常重要的作用就是可以对这些请求做一些控制 。这里拿我们的“防火墙”来说,当我们向“防火墙”发出请求:说我们要上谷歌。“防火墙”检测到谷歌是一个黑名单网站,它就会控制你的连接请求,并给你返回一个错误页面。这就是代理的控制功能。

言归正传,最后再来看看需要租房子的毕业生类:

/**
 * 刚毕业的居无定所的可怜的你。
 * */
class You implements RentingHouse, Student {
	
	private ProxyGuy proxy;
	
	public void connectProxy(){
		proxy = new ProxyGuy();
	}

	@Override
	public float howMuch() {
//		HouseMaster master = HouseMaster.connectHouseMaster(this);   //注释1
//		HouseMaster master = HouseMaster.connectHouseMaster(proxy);  //注释2
//		return master.houMuch();
		
		return proxy.howMuch();
	}
	
}
整个类的设计非常简单,重点看看代码注释1处。这条代码的本意就是你想直接与房东取得联系,不想让中介把价格抬高,于是,你也敲开房东家的大门,并亮出你残破的“学生证”。然后房东砰的一声关上了大门(编译报错,你说,连编译器都不让你过了,你还过得了房东家的门槛吗?)。然后这里可能有同学会钻牛角尖,说,既然You类里已持有一个ProxyGut类对象,那么完全可以通过上面代码注释2的方式来与房东取得联系。是,你是对的。这在代码层面来讲,完全没有任何问题。但是,这种情况对应于现实生活,就是你找到中介,然后对中介说你带我去找房东,然后我自个和房东谈价钱。用脚趾头想想都知道中介不可能答应你的了。所以这条路行不通。因此正确的做法就是通过proxy.howMuch()来得到房屋 信息。

最后,就是发生这个故事的大环境了:

/*
 * 这个故事发生在深圳这座城市里。
 * */
public class ShenZhen {

	public static void main(String[] args) {
		
		You you = new You();
		you.connectProxy();
		float price = you.howMuch();
		System.out.println("The price proxy told you:"+price);
	}

}
在深圳有一个你,你在公告板上得到中介的电话,并联系上中介connectProxy(),然后从中介口里得到最终的房屋价钱。整个程序运行结果如下:

The price HouseMaster told to proxy:800.0
The price proxy told you:1000.0
你就被无情的坑了200块。这就是代理。代理可恨!


工程源码:

http://yunpan.cn/c6Xsx6zICLBHp  访问密码 7f80











  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值