美文网首页
Java设计模式三--代理模式

Java设计模式三--代理模式

作者: 望着天数月亮 | 来源:发表于2018-06-04 15:48 被阅读0次

     代理模式(Proxy Pattern)结构型设计模式之一,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.

    代理模式中有如下角色:

    • Subject:抽象主题类,申明真实主题类的抽象方法。
    • RealSubject:真实主题类,Subject的实现类。
    • Proxy:代理类,持有真实主题类的引用。
    • client:客户端类,调用代理类。

    一、静态代理
     静态代理在代理前就知道要代理谁,代理对象是明确的。

      例子:找李帮我买东西
    /** subject*/
    public interface Shop{
       void buy();
    }
    /** realSubject */
    public class IShop implements Shop{
      @Override
      public void buy(){
        System.out.print("我shop了");
      }
    }
    /** Proxy*/
    public class LiShop implements Shop{
      private IShop iShop;
      public LiShop(IShop iShop){
        this.iShop = iShop;
      }
      @Override
      public void buy(){
         shopBicycle();
         iShop.buy();
      }
      private void shopBicycle(){
         System.out.print("LI买了自行车");
      }
    }
    /** client */
    public class Client{
      public static void main(String[] args){
        Shop shop = new LiShop(new IShop()); 
        shop.buy();
      } 
    }
    

    二、动态代理
      动态代理是在代码运行时,通过反射来动态的生成代理类的对象,并确定到底代理谁,代理对象将在代码运行时决定。

    /** proxy */
    public class DynamicProxy{
      private Object target;
      public DynamicProcxy(Object target){
        this.target= target;
      }
      public Object getProxyInstance(){
        return Proxy.newProxyInstance(
                    target.getClass().getClassLoader(),
                    target.getClass().getInterfaces(),
                    new InvocationHandler() {
                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                            System.out.println("开始事务2");
                            //执行目标对象方法
                            Object returnValue = method.invoke(target, args);
                            System.out.println("提交事务2");
                            return returnValue;
                        }
                    }
            );
      }
    }
    
    /** client */
    public class Client{
        public static void main(String[] args) {
            // 目标对象
            Shop target = new IShop();
            // 【原始的类型 class cn.itcast.b_dynamic.IShop】
            System.out.println(target.getClass());
    
            // 给目标对象,创建代理对象
            Shop proxy = (Shop ) new ProxyFactory(target).getProxyInstance();
            // class $Proxy0   内存中动态生成的代理对象
            System.out.println(proxy.getClass());
    
            // 执行方法   【代理对象】
            proxy.save();
        }
    }
    

    注:代理模式与装饰者模式十分相似,区别在于代理模式是对目标对象的功能进行扩展(对单个方法的功能进行扩展),而装饰者模式是对目标对象添加职责(添加可供调用的方法)。

    相关文章

      网友评论

          本文标题:Java设计模式三--代理模式

          本文链接:https://www.haomeiwen.com/subject/qcqysftx.html