设计模式_代理模式

代理模式的定义:

Provide a surrogate or placeholder for another object to control access to it.

为其他对象提供一种代理以控制对这个对象的访问。

摘抄的一些评论:

代理模式使用代理对象完成用户请求,屏蔽用户对真实对象的访问。现实世界的代理人被授权执行当事人的一些事宜,无需当事人出面,从第三方的角度看,似乎当事人并不存在,因为他只和代理人通信。而事实上代理人是要有当事人的授权,并且在核心问题上还需要请示当事人。

在软件设计中,使用代理模式的意图也很多,比如因为安全原因需要屏蔽客户端直接访问真实对象,或者在远程调用中需要使用代理类处理远程方法调用的技术细节 (如 RMI),也可能为了提升系统性能,对真实对象进行封装,从而达到延迟加载的目的

代理模式通用类图:

代理模式角色分为 4 种:

  • 主题接口:定义代理类和真实主题的公共对外方法,也是代理类代理真实主题的方法;
  • 真实主题:真正实现业务逻辑的类;
  • 代理类:用来代理和封装真实主题;
  • Client:客户端,使用代理类和主题接口完成一些工作。

 主题接口

 1 package cn.rocker.designpattern.proxy;
 2 
 3 /**
 4  * @author rocker
 5  * @version V1.0
 6  * @Description:    抽象主题类
 7  * @date 2018/5/6 18:55
 8  */
 9 public interface Subject {
10     //定义一个方法
11     void request();
12 }

真实主题

 1 package cn.rocker.designpattern.proxy;
 2 
 3 /**
 4  * @author rocker
 5  * @version V1.0
 6  * @Description:
 7  * @date 2018/5/6 19:00
 8  */
 9 public class RealRequest implements Subject{
10     @Override
11     //实现方法
12     public void request() {
13         //业务处理逻辑
14         System.out.println("i am the real object...");
15     }
16 }

代理类

 1 package cn.rocker.designpattern.proxy;
 2 
 3 /**
 4  * @author rocker
 5  * @version V1.0
 6  * @Description:
 7  * @date 2018/5/6 19:01
 8  */
 9 public class Proxy implements Subject{
10 
11     private Subject subject = null;
12     public Proxy(Subject subject){
13         this.subject = subject;
14     }
15 
16     @Override
17     public void request() {
18         this.before();
19         this.subject.request();
20         this.after();
21     }
22 
23     private void before() {
24         //前处理
25         System.out.println("i am the preHandler of the object...");
26     }
27 
28     private void after() {
29         //后处理
30         System.out.println("i am the postHandler of the object...");
31     }
32 }

客户端

 1 package cn.rocker.designpattern.proxy;
 2 
 3 import org.junit.Test;
 4 
 5 /**
 6  * @author rocker
 7  * @version V1.0
 8  * @Description:
 9  * @date 2018/5/6 19:15
10  */
11 public class Client {
12     @Test
13     public void test(){
14         RealRequest realRequest = new RealRequest();
15         Subject proxy = new Proxy(realRequest);
16         proxy.request();
17     }
18 }

猜你喜欢

转载自www.cnblogs.com/rocker-pg/p/8999318.html