浅谈代理模式之静态代理

客官°小女子只卖身不卖艺 2022-12-09 15:54 205阅读 0赞

一、何为代理

在我们生活中有这样一种场景,当你要去租房时,现在的社会很难直接找到房东本人,找到了房东租房时的很多细节可能把握不定,那么中介应运而生,这也是下面谈静态代理举的例子,房东只有一个需求,那就是赶快帮我把房子出租出去,客户也只有一个需求,尽快找到我满意的房子

二、代理模式的好处

可以使真实角色的任务更加纯粹,不需要去关注一些细节的业务
公共部分交给了代理,实现了业务的分工
公共业务发生扩展的时候,方便集中管理

三、角色分析

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

QQ截图20200922175826.jpg

四、代码实现

1、抽象角色,这里用接口创建一个租房的方法,真实对象实现这个方法(也就是房东)

  1. package cn.kexing.Proxy;
  2. //租房
  3. public interface Rent {
  4. void rent();
  5. }

2、真实角色(房东)

  1. package cn.kexing.Proxy;
  2. //房东
  3. public class Host implements Rent{
  4. //调用抽象角色,出租房子
  5. @Override
  6. public void rent() {
  7. System.out.println("房东要出租房子!");
  8. }
  9. }

3、代理角色,代理房东,帮他完成租房功能,另外代理角色还可以执行额外的操作,必须中介带客户看房,签合同,当然 代理不是白代理的,还要抽点手续费

  1. package cn.kexing.Proxy;
  2. //代理对象 代理房东去出租房子,代理对象可做其他工作
  3. /** * */
  4. public class StaticProxy {
  5. private Host host;
  6. public StaticProxy() {
  7. }
  8. public StaticProxy(Host host) {
  9. this.host = host;
  10. }
  11. public void rent(){
  12. host.rent();
  13. //中介的额外操作
  14. watch();
  15. result();
  16. fee();
  17. }
  18. public void watch(){
  19. System.out.println("中介带客户去看房!");
  20. }
  21. public void result(){
  22. System.out.println("中介带客户签合同!");
  23. }
  24. public void fee(){
  25. System.out.println("中介收取一定的手续费!");
  26. }
  27. }

4、客户

  1. package cn.kexing.Proxy;
  2. //客户,需要租房子
  3. public class Client {
  4. public static void main(String[] args) {
  5. Host host = new Host();
  6. StaticProxy proxy = new StaticProxy(host);
  7. proxy.rent();
  8. }
  9. }

QQ截图20200922182150.jpg

五、再理解静态代理

上面我们说过:公共部分交给了代理,实现了业务的分工 这句话怎么理解,这里有一个场景,当你的上级给你说让你在所有业务代码里增加一条输出日志功能,却又不能更改原有代码,这时就可以用代理实现公共部分功能

1、业务接口

  1. package cn.kexing.Proxy2;
  2. //业务接口
  3. public interface UserService {
  4. void add();
  5. void delete();
  6. void update();
  7. void select();
  8. }

2、业务实现

  1. package cn.kexing.Proxy2;
  2. /** * 业务接口实现类 */
  3. public class UserServiceImpl implements UserService{
  4. @Override
  5. public void add() {
  6. System.out.println("增加一个用户");
  7. }
  8. @Override
  9. public void delete() {
  10. System.out.println("删除一个用户");
  11. }
  12. @Override
  13. public void update() {
  14. System.out.println("修改一个用户");
  15. }
  16. @Override
  17. public void select() {
  18. System.out.println("查询一个用户");
  19. }
  20. }

3、代理业务,增加日志

  1. package cn.kexing.Proxy2;
  2. /** * 若想要修改业务的方法,但又不能修改原有的代码 * 那么创建一个代理类来实现 */
  3. public class UserServiceProxy {
  4. private UserServiceImpl userService;
  5. public UserServiceProxy() {
  6. }
  7. public void setUserService(UserServiceImpl userService) {
  8. this.userService = userService;
  9. }
  10. public void add(){
  11. log("add");
  12. userService.add();
  13. }
  14. public void delete(){
  15. log("delete");
  16. userService.delete();
  17. }
  18. public void update(){
  19. log("update");
  20. userService.update();
  21. }
  22. public void select(){
  23. log("select");
  24. userService.select();
  25. }
  26. public void log(String method){
  27. System.out.println("【debug】 实现了"+method+"方法");
  28. }
  29. }

4、客户使用

  1. package cn.kexing.Proxy2;
  2. public class Client {
  3. public static void main(String[] args) {
  4. UserServiceImpl service = new UserServiceImpl();
  5. UserServiceProxy proxy = new UserServiceProxy();
  6. proxy.setUserService(service);
  7. proxy.add();
  8. proxy.delete();
  9. proxy.update();
  10. proxy.select();
  11. }
  12. }

QQ截图20200922182745.jpg

静态代理

  • 优点:代码结构简单,较容易实现
  • 缺点:无法适配所有代理场景,如果有新的需求,需要修改代理类,不符合软件工程的开闭原则

开闭原则:在编写程序的过程中,软件的所有对象应该是对扩展是开放的,而对修改是关闭的

所以,为了提高类的可扩展性和可维护性,满足开闭原则,Java 提供了动态代理机制。
下篇文章来续动态代理

发表评论

表情:
评论列表 (有 0 条评论,205人围观)

还没有评论,来说两句吧...

相关阅读

    相关 代理模式静态代理

    代理模式之静态代理 1.代理模式的概念 二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进

    相关 代理模式-静态代理

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