代理模式
Posted lxzlovewyq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代理模式相关的知识,希望对你有一定的参考价值。
0. 为什么学习代理模式
因为代理模式是spring AOP的底层
1. 代理模式的分类
代理模式分为:静态代理和动态代理
2. 静态代理模式
以租房为例,分析静态代理模式
角色分析
- 抽象角色:一般会使用接口或者抽象类来解决。
- 真实角色:被代理的角色。
- 代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作。
- 客户:访问代理对象的人
代码步骤
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 }
静态代理模式的好处
- 可以使真实角色的操作更加纯粹,不用去关注一些公共的业务。
- 公共业务交给代理角色,实现了业务的分工。
- 公共业务发生扩展的时候,方便集中管理。
缺点:一个真实角色就会产生一个代理角色,代码量会翻倍,开发效率低。
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 }
以上是关于代理模式的主要内容,如果未能解决你的问题,请参考以下文章