设计模式——代理模式(Java)
——Javee
现实生活中,由数不清的代理,如第三方代理售卖火车票、电影票、找中介公司买车、买房之类的。同样,在软件设计中,比如说,我们每个人都可以看到QQ列表里面好友的信息,然而这些数据的存放位置是在腾讯的数据库里,我们肯定不是直接访问数据库得到的数据,而是通过QQ的后端代码访问的数据返回给我们用户。当然,在访问数据的时候,因为后端程序的设置,我们的访问是受限制的,这就可以理解为一个简单的代理(保护代理)。
代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。
代理模式的主要优点有:
-
代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;
-
代理对象可以扩展目标对象的功能;
-
代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度;
其主要缺点有:
-
在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;
-
增加了系统的复杂度;
代理模式的实现比较简单,也很好理解,通过一个实现了抽象主题的代理来包含真实主题,从而实现对真实主题的访问。
代理模式有三个角色:
-
抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
-
真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
-
代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。
话不多说,实例和代码说话:
通过天猫买华为手机:首先有一个抽象主题——手机,在就是真实主题——华为手机,最后就是代理——天猫商城
//代理模式
package cn.edu.ncu.online;
/**
* @Author Javee
* @Date 2019/8/14 20:07
* @Description
*/
public class Test {
public static void main(String[] args) {
Tmall tmall = new Tmall();
tmall.show();
}
}
//抽象主题->手机
interface Phone{
void show();
}
//真实主题->华为手机
class Huawei implements Phone{
@Override
public void show() {
System.out.println("这是一部华为手机...");
}
}
//代理->天猫商城代卖
class Tmall implements Phone{
private Huawei huawei = new Huawei();
@Override
public void show() {
start();
huawei.show();
end();
}
//这里的start和end方法中,可以做任何想做的操作,比如查还有没有货物,或者满足什么样的条件才能购买之类的
public void start(){
System.out.println("天猫代理开始...");
}
public void end(){
System.out.println("天猫代理结束...");
}
}
天猫代理开始...
这是一部华为手机...
天猫代理结束...
代理模式有如下几个应用场景:
-
远程代理 为位于两个不同地址空间对象的访问提供了一种实现机制,可以将一些消耗资源较多的对象和操作移至性能更好的计算机上,提高系统的整体运行效率。
-
虚拟代理 通过一个消耗资源较少的对象来代表一个消耗资源较多的对象,可以在一定程度上节省系统的运行开销。
-
缓冲代理 为某一个操作的结果提供临时的缓存存储空间,以便在后续使用中能够共享这些结果,优化系统性能,缩短执行时间。
-
保护代理 可以控制对一个对象的访问权限,为不同用户提供不同级别的使用权限。