代理模式(Proxy)

mac2022-06-30  75

定义:

代理模式是代理类替代被代理的类执行一些行为,简而言之就是用一个对象来代表另一个对象。

为什么要是用代理类:

为被代理的类提供访问控制,也就是降低了被代理的类与其他类的耦合,举个例子,明星拍吻戏的时候不愿意怎么办呢,就可以找个替身,这个替身不就是个代理类吗,降低明星与其他人的接触。

代理模式的结构:

 

代理模式源码

package Proxy; /* * 项目名称:desginProject * @author:wzc * @date 创建时间:2017年9月3日 下午2:16:36 * @Description:抽象主题类 * @parameter * */ public interface Subject { //定义一个方法 public void method(); } package Proxy; /* * 项目名称:desginProject * @author:wzc * @date 创建时间:2017年9月3日 下午2:18:13 * @Description:真实主题类 * @parameter * */ public class realSubject implements Subject{ //实现方法 @Override public void method() { // TODO Auto-generated method stub } }

 编写代理类:

package Proxy; /* * 项目名称:desginProject * @author:wzc * @date 创建时间:2017年9月3日 下午2:18:59 * @Description:代理类 * @parameter * */ public class Proxy implements Subject{ //要代理那个实现类 private Subject subject=null; public Proxy() { super(); } public Proxy(Subject subject) { super(); this.subject = subject; } //实现方法 @Override public void method() { before(); subject.method(); //为代理者办事 after(); } //前置处理 public void before(){ //doSomething } //后置处理 public void after(){ //doSomething } }

代理模式的应用

现在就以明星和替身的例子完成代理模式代码 package Proxy; /* * 项目名称:desginProject * @author:wzc * @date 创建时间:2017年9月3日 下午2:16:36 * @Description:抽象主题类 * @parameter * */ public interface people{ //定义拍武打的行为 public void actions(); //定义一个拍吻戏的行为 public void kiss(); } package Proxy; /* * 项目名称:desginProject * @author:wzc * @date 创建时间:2017年9月3日 下午2:18:13 * @Description:真实主题类 * @parameter * */ public class realStar implements people{ @Override public void actions() { System.out.println("拍动作戏----成功开拍"); } @Override public void kiss() { System.out.println("拍吻戏-----成功开拍"); } } package Proxy; /* * 项目名称:desginProject * @author:wzc * @date 创建时间:2017年9月3日 下午2:18:59 * @Description:代理类 * @parameter * */ public class Proxy implements people{ //要代理那个实现类 private people star=null;//代理类需要保留一个被代理者的应用,好知道执行谁的行为 public Proxy() { super(); } public Proxy(people star) { super(); this.star = star; } //实现接口方法 @Override public void actions() { System.out.println("找替身拍武戏"); before(); star.actions(); //代替被替代者执行 after(); } //实现接口方法 @Override public void kiss() { System.out.println("找替身拍吻戏"); before(); star.kiss(); //代替被替代者执行 after(); } //前置处理 public void before(){ System.out.println("上场前,替身需要化妆"); } //后置处理 public void after(){ System.out.println("上场后,替身需要卸妆"); } }

 测试一下

@Test public void test() { realStar star=new realStar(); Proxy proxy=new Proxy(star); System.out.println("明星需要拍武戏"); proxy.actions(); System.out.println("明星需要拍吻戏"); proxy.kiss(); }

 

优点:

1)代理模式能将代理对象与真正被调用的对象分离,在一定程度上降低了系统的耦合度。 2)代理模式在客户端和目标对象之间起到一个中介作用,这样可以起到保护目标对象的作用。代理对象也可以对目标对象调用之前进行其他操作。

代理模式的应用形式

远程代理:可以为一个不同的地址空间的对象提供一个局域代表对象; 虚拟代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建; 安全代理:基于访问权限可以控制对一个对象的访问; 智能指引:调用真实对象时,代理可以处理另外的事情。

 

 

 

 

 

转载于:https://www.cnblogs.com/Actexpler-S/p/7469607.html

最新回复(0)