设计模式之——代理模式

概述

代理模式(Proxy Pattern)也称为委托模式。代理模式在生活中经常见,比如访问国外网站时,连上代理服务器,就可以轻松畅游全世界的网络。既然代理模式这么普遍,我们有必要了解下代理模式如果做到的?

定义

为其他对象提供一种代理以控制对这个对象的访问

使用场景

当无法或不想访问这个对象或访问某个对象困难时,可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象要实现相同的接口。

UML类图

代理模式
角色介绍:

  • Subject:抽象主题类
    该类的主要职责是声明真实主题与代理的共同接口方法,该类既可以是一个抽象类也可以是一个接口

  • RealSubject:真是主题类
    该类也称为被委托活代理类,该类定义了代理所表示的真实对象,由其执行具体的业务逻辑方法,而客户端则通过代理类间接调用真实主题类的定义方法。

  • ProxySubject:代理类
    该类也称为委托代理类,该类持有一个对真实主题类的引用,在其所实现的接口方法中调用真实主题类中相应的接口方法执行,以此起到代理作用。

  • Client: 客户类,即使用代理类的实现

    示例代码

    创建抽象主题类

    public interface Subject
    {

      /**
       * 业务方法
       */    
      void visit();
    

    }

    创建具体主题类

    public class RealSubject implements Subject
    {

      /**
       * 业务实现
       */
      public void visit() 
      {
          System.out.println("Real Subject");
      }
    

    }

    创建代理类

    public class ProxySubject implements Subject
    {

      // 真实主题引用对象
      Subject mSubject;
    
      public ProxySubject(Subject subject) 
      {
          this.mSubject = subject;
      }
    
      @Override
      public void visit() 
      {
          // 通过具体主题类的引用对象调用真实主题的业务方法
          mSubject.visit();
      }
    

    }

    创建测试类

    public class Test
    {

      public static void main(String[] args) 
      {
          // 构造一个真实主题对象
          Subject subject = new RealSubject();
          // 通过真实主题对象创建一个代理对象
          ProxySubject proxySubject = new ProxySubject(subject);
          // 调用代理的相关业务方法
          proxySubject.visit();
      }
    

    }

    Log打印

    Real Subject