zoukankan      html  css  js  c++  java
  • 11代理模式Proxy

    一、什么是代理模式

      Proxy模式又叫做代理模式,是构造型的设计 模式之一,它可以为其他对象提供一种代理(Proxy)以 控制对这个对象的访问。

      所谓代理,是指具有与代理元(被代理的对象)具有 相同的接口的类,客户端必须通过代理与被代理的目标 类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理。

    二、代理模式的结构

    三、代理模式的角色和职责

      subject(抽象主题角色): 真实主题与代理主题的共同接口。

      RealSubject(真实主题角色):      定义了代理角色所代表的真实对象。

      Proxy(代理主题角色):     含有对真实主题角色的引用,代理角色通常在将客户端调用传递给真是主题对象之前或者之后执行某些操作,而不是单纯返回真实的对象。

    四、动态代理

      1. InvocationHandler 接口 2. invoke方法 3. Proxy.newProxyInstance();

    没用代理模式

    主题

    1 //主题
    2 public interface Subject {
    3     public  void sailBook();
    4 }

    现实主题

    1 //现实主题
    2 public class RealSubject implements Subject {
    3 
    4     public void sailBook() {
    5         System.out.println("卖书");
    6     }
    7 }

    代理主题

     1 //代理主题
     2 public class ProxySubject implements Subject{
     3     private RealSubject realSubject;
     4 
     5     public void sailBook() {
     6         dazhe();
     7         if(realSubject == null) {
     8             realSubject = new RealSubject();
     9         }
    10         realSubject.sailBook();
    11         give();
    12     }
    13     
    14     public void dazhe() {
    15         System.out.println("打折");
    16     }
    17     
    18     public void give() {
    19         System.out.println("赠送代金券");
    20     }
    21 }

    测试

    1 public class MainClass {
    2     public static void main(String[] args) {
    3         ProxySubject proxySubject = new ProxySubject();
    4         proxySubject.sailBook();
    5     }
    6 }

    ==============================================================

    使用代理模式

    主题

    1 //主题
    2 public interface Subject {
    3     public  void sailBook();
    4 }

    真实主题

    1 //真实主题
    2 public class RealSubject implements Subject {
    3 
    4     public void sailBook() {
    5         System.out.println("卖书");
    6     }
    7 }

    My处理程序  实现 调用处理程序

     1 public class MyHandler implements InvocationHandler {
     2     private RealSubject realSubject;
     3     
     4     public void setRealSubject(RealSubject realSubject) {
     5         this.realSubject = realSubject;
     6     }
     7 
     8     public Object invoke(Object proxy, Method method, Object[] args){
     9         Object result = null;
    10         dazhe();
    11         try {
    12             result = method.invoke(realSubject, args);
    13         } catch (IllegalArgumentException e) {
    14             e.printStackTrace();
    15         } catch (IllegalAccessException e) {
    16             e.printStackTrace();
    17         } catch (InvocationTargetException e) {
    18             e.printStackTrace();
    19         }
    20         give();
    21         return result;
    22     }
    23     
    24     public void dazhe() {
    25         System.out.println("打折");
    26     }
    27     
    28     public void give() {
    29         System.out.println("赠送代金券");
    30     }
    31 }

    测试

     1 import java.lang.reflect.Proxy;
     2 
     3 public class MainClass {
     4     public static void main(String[] args) {
     5         RealSubject realSubject = new RealSubject();
     6         MyHandler myHandler = new MyHandler();
     7         myHandler.setRealSubject(realSubject);
     8         
     9         Subject proxySubject = (Subject)Proxy.newProxyInstance(RealSubject.class.getClassLoader(), 
                realSubject.getClass().getInterfaces(), myHandler);
    10 proxySubject.sailBook(); 11 } 12 }
  • 相关阅读:
    leetcode1078
    leetcode417
    我在机器学习踩过的坑,现在告诉你怎么跳过去
    Python相关机器学习‘武器库’
    分别列举人工智能4个主要领域中最牛叉的10位专家
    多巴胺:谷歌开源新型增强学习框架
    AI产品经理成长路
    一个AI产品经理怎么看AI的发展
    机器学习的数学基础
    方差variance, 协方差covariance, 协方差矩阵covariance matrix
  • 原文地址:https://www.cnblogs.com/justdoitba/p/9033079.html
Copyright © 2011-2022 走看看