- 简介
- 理模式在Java中十分常见,有为扩展某些类的功能而使用静态代理,也有如Spring实现AOP而使用动态代理,更有RPC实现中使用的调用端调用的代理服务。
- 定义
- 为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
- 组成
- ISubject:抽象主题角色,是一个接口。该接口是对象和它的代理共用的接口。
- RealSubject:真实主题角色,是实现抽象主题接口的类。
- Proxy:代理角色,内部含有对真实对象RealSubject的引用,从而可以操作真实对象。代理对象提供与真实对象相同的接口,以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
- 步骤
- 创建一个抽象对象接口:
package com.lvsling.proxy;
public interface Star {
void movieShow(int money);
} |
- 创建真实对象接口
package com.lvsling.proxy;
public class MovieStar implements Star {
public void movieShow(int money) { System.out.println("movie star movie show, pay: " + money); }
} |
- 创建代理对象类
package com.lvsling.proxy;
public class MovieStarProxy implements Star { private Star star;
public MovieStarProxy(Star star){ this.star = star; }
/* 代理movie show condition */ public void movieShow(int money) { if (money > 10000) { star.movieShow(money); } else { System.out.println("Movie star does not take movie show witch noney less than 10000"); } }
} |
- 客户端调用代理对象
package com.lvsling.proxy;
public class Client { public static void main(String[] args) { MovieStar movieStar = new MovieStar(); //直接调用真实对象 movieStar.movieShow(10000); Star movieStarProxy = new MovieStarProxy(movieStar); //调用代理对象 movieStarProxy.movieShow(10000); movieStarProxy.movieShow(20000);
}
} |
- 控制台打印输出
movie star movie show, pay: 10000 Movie star does not take movie show witch noney less than 10000 movie star movie show, pay: 20000 |
- 优点
- 代理模式能将代理对象与真正被调用的对象分离,在一定程度上降低了系统的耦合度。
- 代理模式在客户端和目标对象之间起到一个中介作用,这样可以起到保护目标对象的作用。代理对象也可以对目标对象调用之前进行其他操作。
- 缺点
- 在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢。
- 增加了系统的复杂度。
- 应用场景
- 远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
- 虚拟代理,根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的对象。
- 安全代理,用来控制真实对象访问时的权限。
- 智能指引,当调用目标对象时,代理可以处理其他的一些操作。
- 总结
- 代理模式其实很好理解,代理,代理,我们的生活中,一般明星都有自己的经纪人,那么经纪人就是明星的代理,我们租房找的中介也是物主的代理人。所以代理模式中代理对象可以在客户端和目标对象之间起到中介的作用