设计模式读书笔记-代理模式

2016-08-21
读书笔记
  • 为其他对象提供一种代理以控制对这个对象的访问。
  • 代理模式也叫做委托模式,许多其他的模式如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式。
  • struts2的form元素映射就采用了动态代理模式。spring aop是非常典型的动态代理。
  • GG请Proxy代替他去追MM,GG包含一个MM,Proxy包含一个GG
  • Proxy的方法中执行的是GG的同名方法Proxy
  • Proxy与GG具有相同的方法,抽取其共性为Same_ProxyAndGG
  • 代码
public class Same_ProxyAndGG {

    public void giveGiftA(){
    }

    public void giveGiftB(){
    }

    public void giveGiftC(){
    }

}


public class MM {

    private String name;//set  get

    public MM(String name) {
        this.name = name;
    }

}


public class GG extends Same_ProxyAndGG{

    private MM mm;

    public GG(MM mm){
        this.mm = mm;
    }

    public void giveGiftA(){
        System.out.println("GG送给"+mm.getName()+" GiftA");
    }

    public void giveGiftB(){
        System.out.println("GG送给"+mm.getName()+" GiftB");
    }

    public void giveGiftC(){
        System.out.println("GG送给"+mm.getName()+" GiftC");
    }

}


public class Proxy extends Same_ProxyAndGG{

    private GG gg;

    public Proxy(GG gg) {
        this.gg = gg;
    }

    public void giveGiftA(){
        gg.giveGiftA();
    }

    public void giveGiftB(){
        gg.giveGiftB();
    }

    public void giveGiftC(){
        gg.giveGiftC();
    }

}


public class Client {
    public static void main(String[] args){

        MM mm = new MM("漂亮妹纸");
        GG gg = new GG(mm);

        Proxy proxy = new Proxy(gg);

        proxy.giveGiftA();
        proxy.giveGiftB();
        proxy.giveGiftC();
    }
}

动态代理(spring aop)

  • 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
  • 动态代理
    • 在程序运行时,运用反射机制动态创建而成。
    • 动态代理是在实现阶段不用关心代理谁,在运行阶段才指定代理哪一个对象。
  • aop:切面(Aspect)、切入点(JoinPoint)、通知(Advice)、织入(Weave)
  • java.lang.reflect包中的Proxy类和InvocationHandler接口提供了生成动态代理类的能力。

    • InvocationHandler接口

      public interface InvocationHandler { 
          public Object invoke(Object proxy,Method method,Object[] args) throws Throwable; 
      }
      
      参数说明: 
      Object proxy:指被代理的对象。 
      Method method:要调用的方法 
      Object[] args:方法调用时所需要的参数 
      
    • Proxy类:专门完成代理的操作类,可通过此类为一个或多个接口动态地生成实现类,此类提供了如下的操作方法:

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException 
参数说明: 
ClassLoader loader:类加载器 
Class<?>[] interfaces:得到全部的接口 
InvocationHandler h:得到InvocationHandler接口的子类实例
  • 代码

Kommentare: