静态代理模式

简介:

•代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。
•在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用

•代理模式一般涉及到的角色有
–抽象角色:声明真实对象和代理对象的共同接口
–代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,
同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。
同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装
–真实角色:代理角色所代表的真实对象,是我们最终要引用的对象

•参见程序Subject.java
•参见程序RealSubject.java
•参见程序ProxySubject.java
•参见程序Client.java

Subject.java

复制代码
1 package cn.itcast.proxy;
2 
3 //定义一个抽象类,代理角色和真实角色都要实现这个共同的抽象类
4 public abstract class Subject {
5     //定义一个方法,这个方法就好比中介和房东都有向外租房子的方法
6     public abstract void request();
7 }
复制代码

RealSubject.java

复制代码
1 package cn.itcast.proxy;
2 
3 //这个类好比是真正的房东.实现向外租房子的方法
4 public class RealSubject extends Subject{
5     public void request() {
6         System.out.println("真正的房东向外租房子");
7     }
8 }
复制代码

ProxySubject.java

复制代码
 1 package cn.itcast.proxy;
 2 
 3 //这个类是好比是中介(代理房东向外租房子),和房东(RealSubject)共同实现了Subject抽象类(接口)
 4 public class ProxySubject extends Subject {
 5     //代理类(中介)要有一个真实类(RealSubject)的一个引用
 6     private RealSubject realSubject;
 7     
 8     public void request() {
 9         this.preRequest();//this就是ProxySubject的一个对象  ProxySubject proxy = new ProxySubject.
10         if(null == realSubject){
11             realSubject = new RealSubject();
12         }
13         realSubject.request();//真实角色完成事情
14         this.bacRequest();
15     }
16     //代理对象可以在真实角色完成的前后增加一些自己的方法.
17     //就好比中介先要领房客看房(preRequest()方法),
18     //然后和房东,房客一起完成租房(request()方法),
19     //最后收取房客钱(bacRequest()方法)
20     private void preRequest(){
21         System.out.println("中介领房客看房子");
22     }
23     private void bacRequest(){
24         System.out.println("中介向房客收钱");
25     }
26 }
复制代码

Client.java

复制代码
 1 package cn.itcast.proxy;
 2 //这个类就好比是房客要租房子
 3 //
 4 public class Client {
 5     public static void main(String[] args) {
 6         Subject porxySubject = new ProxySubject();
 7         porxySubject.request();
 8     }
 9 }
10     /*
11     打印内容:
12         中介领房客看房子
13         真正的房东向外租房子
14         中介向房客收钱
15     */
复制代码

 

•由以上代码可以看出,客户实际需要调用的是RealSubject类的request()方法,
现在用ProxySubject来代理RealSubject类,同样达到目的,同时还封装了其他方法(preRequest(),postRequest()),可以处理一些其他问题。
•另外,如果要按照上述的方法使用代理模式,那么真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。
但是实际使用时,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?
这个问题可以通过Java的动态代理类来解决

 


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/4005069.html,如需转载请自行联系原作者

相关文章
|
设计模式 弹性计算 人工智能
阿里技术专家详解DDD系列 第四讲 - 领域层设计规范
在一个DDD架构设计中,领域层的设计合理性会直接影响整个架构的代码结构以及应用层、基础设施层的设计。但是领域层设计又是有挑战的任务,特别是在一个业务逻辑相对复杂应用中,每一个业务规则是应该放在Entity、ValueObject 还是 DomainService是值得用心思考的,既要避免未来的扩展性差,又要确保不会过度设计导致复杂性。
|
Java
JDK1.8源码下载及获取、导入IDEA阅读、配置JDK源码
本文是博主学习JDK源码的记录,希望对大家有所帮助。
2741 0
JDK1.8源码下载及获取、导入IDEA阅读、配置JDK源码
|
微服务 测试技术 Java
阿里技术专家详解 DDD 系列- Domain Primitive
关于DDD的一系列文章,希望能继续在总结前人的基础上发扬光大DDD的思想,但是通过一套我认为合理的代码结构、框架和约束,来降低DDD的实践门槛,提升代码质量、可测试性、安全性、健壮性。
62422 17
阿里技术专家详解 DDD 系列- Domain Primitive
|
4月前
|
人工智能 Rust 并行计算
AI大模型开发语言排行
AI大模型开发涉及多种编程语言:Python为主流,用于算法研发;C++/CUDA优化性能;Go/Rust用于工程部署;Java适配企业系统;Julia等小众语言用于科研探索。
1402 127
|
机器学习/深度学习 架构师 Java
面试阿里P6,过关斩将直通2面,结果3面找了个架构师来吊打我?
人人都有大厂梦,对于程序员来说,BAT为首的一线互联网公司肯定是自己的心仪对象,毕竟能到这些大厂工作,不仅薪资高待遇好,而且能力技术都能够得到提升,最关键的是还能够给自己镀上一层金,让人瞻仰。
|
测试技术 开发者
单元测试问题之在Mockito中静态方法的调用,如何模拟
单元测试问题之在Mockito中静态方法的调用,如何模拟
|
存储 Java 测试技术
阿里巴巴java开发手册
这篇文章是关于阿里巴巴Java开发手册的整理,内容包括编程规约、异常日志、单元测试、安全规约、MySQL数据库使用以及工程结构等方面的详细规范和建议,旨在帮助开发者编写更加规范、高效和安全的代码。
|
存储 设计模式 Java
阿里官方代码规范
这篇文章详细介绍了阿里巴巴官方的代码规范,包括命名规则、常量使用、方法覆写、并发处理、注释规范、数据库设计等多个方面,旨在提高代码的可读性、维护性和扩展性。
|
Java 关系型数据库 MySQL
Java SPI机制的原理和实践
SPI 全称 Service Provider Interface,是 Java 提供的,旨在由第三方实现或扩展的 API,它是一种用于动态加载服务的机制。Java 中 SPI 机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是解耦。
531 0
|
负载均衡 网络协议 Java
二面蚂蚁金服(交叉面),已拿offer,Java岗定级阿里P6
记一次蚂蚁金服Java程序员面试经历(均为交叉面)