设计模式之代理模式

设计模式之代理模式

定义
  为其他对象提供一个代理以控制对这个对象的访问
使用场景
  • 当被访问的对象不想暴露全部内容时,可以通过代理去掉被访问的内容。

  • 当一个对象不能或不想直接访问另一个对象时,可以通过一个代理间接的访问。为保证客户端的使用的透明性,委托对象和代理对象要实现同样的接口。

UML

  • Subject

    抽象主题接口,定义了真实主题类和代理主题类公共的接口方法
    
  • RealSubject

    真实主题类,代表真实对象,执行具体的业务逻辑。客户端通过代理间接的访问这个真实主题中方法。
    
  • ProxySubject

    代理主题类。持有真实主题类的引用,在接口方法中调用真实主题类的相关方法,达到代理的作用。
    

代理之静态代理

  • 抽象主题类 定义了委托对象和代理对象共同的接口方法

    public interface Subject {
    
        void sumbit();
    
        void burden();
    
        void defend();
    
        void finish();
    }
    
  • 真实主题类 实现真正业务逻辑,便于客户端通过代理类间接进行访问

       public class RealSubject implements Subject {
    
    
        private static final String TAG = "RealSubject";
    
        @Override
        public void sumbit() {
            Log.i(TAG,"起诉");
        }
    
        @Override
        public void burden() {
            Log.i(TAG,"举证");
        }
    
        @Override
        public void defend() {
            Log.i(TAG,"辩护 ");
        }
    
        @Override
        public void finish() {
            Log.i(TAG,"胜诉");
        }
    }
    
    • 代理主题类 持有委托对象的引用,在相应的接口方法中调用委托对象的方法

      public class ProxySubject implements Subject {
      
          private Subject mILawsuit;
      
          public ProxySubject(Subject mILawsuit) {
              this.mILawsuit = mILawsuit;
          }
      
          @Override
          public void sumbit() {
              mILawsuit.sumbit();
          }
      
          @Override
          public void burden() {
              mILawsuit.burden();
          }
      
          @Override
          public void defend() {
              mILawsuit.defend();
          }
      
          @Override
          public void finish() {
              mILawsuit.finish();
          }
      }
      
  • 客户端实现

     RealSubject mCivilian=new RealSubject();
            ProxySubject proxy=new ProxySubject(mCivilian);
            Log.i(TAG,"----------------------------静态代理-----------------");
            proxy.sumbit();
            proxy.burden();
            proxy.defend();
            proxy.finish();
            Log.i(TAG,"----------------------------静态代理-----------------");
    

代理之动态代理 通过反射动态的生成代理者对象

  • 抽象主题类 定义了委托对象和代理对象共同的接口方法

    public interface Subject {
    
        void sumbit();
    
        void burden();
    
        void defend();
    
        void finish();
    }
    
  • 真实主题类 实现真正业务逻辑,便于客户端通过代理类间接进行访问

       public class RealSubject implements Subject {
    
    
        private static final String TAG = "RealSubject";
    
        @Override
        public void sumbit() {
            Log.i(TAG,"起诉");
        }
    
        @Override
        public void burden() {
            Log.i(TAG,"举证");
        }
    
        @Override
        public void defend() {
            Log.i(TAG,"辩护 ");
        }
    
        @Override
        public void finish() {
            Log.i(TAG,"胜诉");
        }
    }
    
  • 动态代理生成类

    public class DynamicProxySubject implements InvocationHandler {
    
        private Object  mObject;
    
        public DynamicProxySubject(Object mObject) {
            this.mObject = mObject;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            //当然这里可以对方法名进行判断过滤 if(method.getName().equals("***"))
            Object  result= method.invoke(mObject,args);
            return result;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值