代理模式(代理设计模式)
在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如,购买火车票不一定要去火车站买,可以通过 12306 网站或者去火车票代售点买。又如找女朋友、找保姆、找工作等都可以通过找中介完成。
在软件设计中,使用代理模式的例子也很多,例如,要访问的远程对象比较大(如视频或大图像等),其下载要花很多时间。还有因为安全原因需要屏蔽客户端直接访问真实对象,如某单位的内部数据库等。
代理模式的定义与特点
代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。 代理模式的主要优点有:
-
代理模式会造成系统设计中类的数量增加
-
在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;
-
增加了系统的复杂度;
那么如何解决以上提到的缺点呢?答案是可以使用动态代理方式
代理模式的结构与实现
代理模式的结构比较简单,主要是通过定义一个继承抽象主题的代理来包含真实主题,从而实现对真实主题的访问,下面来分析其基本结构和实现方法。 代理模式的主要角色如下。
在代码中,一般代理会被理解为代码增强,实际上就是在原代码逻辑前后增加一些代码逻辑,而使调用者无感知。
-
静态:由程序员创建代理类或特定工具自动生成源代码再对其编译,在程序运行前代理类的 .class 文件就已经存在了。
-
动态:在程序运行时,运用反射机制动态创建而成
代理模式,我们就可以联想到,租房子是不是就是你可以不用见到房东,你只需要联系中介,就可以租房子哇,接下来我们用个租房子的问题给他拿捏代理模式。
首先我们创建一个租房(Rent)接口,里面有租房的方法
/*
**@haKu
*/
public interface Rent {
public void rent();
}
我们的房东(Host)要出租房子,则放出公告,要出租房子
/*
**@haKu
* 房东
*/public class Host implements Rent{
@Override
public void rent() {
System.out.println("房东要出租房子!");
}
}
我们的房东肯定比较有钱,就不止一套房子,就觉得自己去出租房子,联系啥啥的很麻烦,所以我们就有了一个代理人,简称房产中介(Proxy)
/*
**@haKu
*/public class Proxy implements Rent {
private Host host;
public Proxy(){}
public Proxy(Host host) {
this.host = host;
}
@Override
public void rent() {
seeHouse();
host.rent();
hetong();
fare();
}
//看房
public void seeHouse(){
System.out.println("中介带你看房");
}
//看房
public void hetong(){
System.out.println("签租赁合同!");
}
//收中介费
public void fare(){
System.out.println("收中介费!");
}
}
上面的流程,中介要带你看房,如果你满意就签合同,给钱啥啥的 哈哈,是不是给房东省了很多时间
最后再来个测试类:Client
/*
**@haKu
*/public class Client {
public static void main(String[] args) {
//房东要租房子
Host host=new Host();
//代理,中介帮房东租房子,但是呢?代理角一般会有一些附属操作
Proxy proxy=new Proxy(host);
//你不用面对房东,直接找中介租房即可
proxy.rent();
}
}
测试结果:
所以整个流程走下来,房东只需要提供房子就行,其他啥都不管,就让我们的代理大佬(房产中介)去办事儿就行,其他啥都不用操心,同时我们的房东租户也方便了,简称中间商赚差价!
文章评论