代理模式

Posted lxzlovewyq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代理模式相关的知识,希望对你有一定的参考价值。

0. 为什么学习代理模式

因为代理模式是spring AOP的底层

1. 代理模式的分类

代理模式分为:静态代理和动态代理

2. 静态代理模式

以租房为例,分析静态代理模式

技术图片

角色分析

  1. 抽象角色:一般会使用接口或者抽象类来解决。
  2. 真实角色:被代理的角色。
  3. 代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作。
  4. 客户:访问代理对象的人

代码步骤

   1. 接口(租房)

1 public interface Rent {
2     public void rent();
3 }

 

   2. 真实角色

1 public class Host implements Rent{
2     @Override
3     public void rent() {
4         System.out.println("房东要租房子");
5     }
6 }

 

   3. 代理角色

 1 public class Proxy implements Rent{
 2     private Host host;
 3     Proxy(){
 4 
 5     }
 6     Proxy(Host host){
 7         this.host=host;
 8     }
 9     @Override
10     public void rent() {
11         host.rent();
12     }
13 }

 

   4. 客户端访问代理角色

 1 public class Client {
 2     public static void main(String[] args) {
 3         Host host= new Host();
 4         //直接从房东这里租房子
 5         //host.rent();
 6         //代理,中介帮房东租房子,代理一般会有一些其他的操作
 7         Proxy proxy= new Proxy(host);
 8         proxy.rent();
 9     }
10 }

静态代理模式的好处

  1. 可以使真实角色的操作更加纯粹,不用去关注一些公共的业务。
  2. 公共业务交给代理角色,实现了业务的分工。
  3. 公共业务发生扩展的时候,方便集中管理。

缺点:一个真实角色就会产生一个代理角色,代码量会翻倍,开发效率低。

3. 静态代理模式(再理解)

模拟日常的增删改查的demo

1. 创建接口(增删改查)

1 public interface Service {
2     public void add();
3     public void delete();
4     public void update();
5     public void query();
6 }

 

2.  实现增删改查业务

 1 public class ServiceImpl implements Service{
 2     @Override
 3     public void add() {
 4         System.out.println("添加了数据");
 5     }
 6 
 7     @Override
 8     public void delete() {
 9         System.out.println("删除了数据");
10     }
11 
12     @Override
13     public void update() {
14         System.out.println("更新了数据");
15     }
16 
17     @Override
18     public void query() {
19         System.out.println("查询了数据");
20     }
21 }

 

3. 目前想要在不改变ServiceImpl的情况下,添加日志记录功能,需要添加代理

 1 public class ServiceProxy implements Service{
 2     private ServiceImpl serviceImpl;
 3 
 4     public void setServiceImpl(ServiceImpl serviceImpl) {
 5         this.serviceImpl = serviceImpl;
 6     }
 7 
 8     @Override
 9     public void add() {
10         log("add");
11         serviceImpl.add();
12     }
13 
14     @Override
15     public void delete() {
16         log("delete");
17         serviceImpl.delete();
18     }
19 
20     @Override
21     public void update() {
22         log("update");
23         serviceImpl.update();
24     }
25 
26     @Override
27     public void query() {
28         log("query");
29         serviceImpl.query();
30     }
31 
32     //日志方法
33     public void log(String msg){
34         System.out.println("使用了"+msg+"方法");
35     }
36 }

 

4. 客户访问代理角色,客户既访问了业务对象又访问了代理代理对象,实现了日志方法和业务方法的结合

1 public class ServiceClient {
2     public static void main(String[] args) {
3         ServiceImpl serviceImpl = new ServiceImpl();
4         ServiceProxy serviceProxy=new ServiceProxy();
5         serviceProxy.setServiceImpl(serviceImpl);
6         serviceProxy.delete();
7 
8     }
9 }

 

以上是关于代理模式的主要内容,如果未能解决你的问题,请参考以下文章

scrapy按顺序启动多个爬虫代码片段(python3)

用于从 cloudkit 检索单列的代码模式/片段

java代码实现设计模式之代理模式

代理模式(静态代理动态代理)代码实战(详细)

Java设计模式-代理模式之动态代理(附源代码分析)

代理模式(静态代理)