zoukankan      html  css  js  c++  java
  • 谈谈Java中的代理模式

    首先来看一下代理模式的定义:
    为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用, 其特征是代理类与委托类有同样的接口。代理模式是常用的java设计模式。

    代理模式能够在不修改源码的情况下增强方法,在方法前后增加日志记录,权限管理等功能。

    表现形式如下图:

    在java中,代理模式分成2种:静态代理模式和动态代理模式;今天我们主要讨论的是静态代理。

    1 静态代理
    静态代理模式满足如下的几个条件:
    a.代理对象的类是真实存在的,并非动态生成的。
    b.代理对象持有被代理对象的引用
    c.代理对象中的方法通过被代理对象的引用调用被代理对象的方法,同时执行代理逻辑。

    下面是一个简单的代理模式,相关代码说明已经在注释中给出,不再另外说明

    接口类:

    /*
    +V.X java8733 获取更多资源
     
     * 接口
     * 代理类和委托类都必须实现该类
     */
    public interface ISubject {
    
    //处理任务的抽象方法
    public void dealTask(String task);
    }
    

      

    委托类:

    /*
    +V.X java8733 获取更多资源
     
     * 真实角色(被代理类,委托类)
     * 实现接口Isubject
     */
    public class RealSubject implements ISubject {
     
    @Override
    public void dealTask(String task) {
    //真实角色处理任务
    System.out.println("正在"+task);
    }
    
    } 
    

      

    代理类:

    /*
    +V.X    java8733 获取更多资源
     
     * 代理类
     * 实现ISubject接口
     *  持有被代理类的引用
     */
    public class Proxy implements ISubject {
    
    //持有被代理类的引用
    private RealSubject realSubject;
    
    //在构造方法中初始化被代理类
    public Proxy(RealSubject r) {
    this.realSubject=r;
    }
    
    @Override
    //在该方法中加入代理逻辑
    public void dealTask(String task) {
    System.out.println("开始帮忙....");
    //加入线程睡眠模拟帮忙的行为
    try {
    Thread.sleep(2000);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    //真正执行动作的仍然是真实角色
    realSubject.dealTask(task);
    }
    
    }
    

      

    静态工厂类:

    /*
    +V.X    java8733 获取更多资源
     
     * 静态工厂类
     * 对于客户端来说 并不关心执行动作的是代理对象还是真实角色
     * 所以我们创建一个静态方法直接返回对象
     */
    public class StaticFactory {
    
    //调用此方法获得实例
    public static ISubject getInstance(){
    return new Proxy(new RealSubject());
    }
    }
    

      

    测试类:

    /*
     * 测试类(客户类)
    +V.X   java8733 获取更多资源
     */
    public class Test {
    
    public static void main(String[] args) {
    //创建代理对象时需要一个真实对象的实例
    ISubject instance = StaticFactory.getInstance();
    //使用代理类的方法
    instance.dealTask("敲代码");
    }
    }
    

      

    就是这样,真正的业务功能还是有委托类来实现,但是在实现业务类之前的一些公共服务。例如在项目开发中我们没有加入缓冲,日志这些功能,后期想加入,我们就可以使用代理来实现,而没有必要打开已经封装好的委托类。

    推荐阅读上海尚学堂java相关技术文章,欢迎评论建议,转载请注明出处!

  • 相关阅读:
    如何下载无水印的抖音视频?
    @valid和自定义异常
    Centos7查看外网ip,yum安装的curl无法正常使用
    ElasticSearch安装
    Redis的主从架构+哨兵模式
    Redis的持久化方式
    Nacos 注册中心集群搭建
    kafka安装流程
    WinUI 3学习笔记(1)—— First Desktop App
    .NET 5学习笔记(12)——WinUI 3 Project Reunion 0.5
  • 原文地址:https://www.cnblogs.com/shsxt/p/8341042.html
Copyright © 2011-2022 走看看