设计模式之代理模式

        要想了解代理模式首先要知道什么是代理模式?代理模式的使用场景是什么,有什么优缺点。顾名思义,代理模式关键就是一个代理,为什么要代理,是因为原来的业务类已经不能满足需求的变化,如果直接在原来的业务类上修改,改动工作量大,而且容易引发新的问题,因此我们需要一个代理类,在代理类实现业务的扩展需要,实际上代理类并不真正实现服务,而是通过调用委托类的相关方法提供特定的服务。代理又包含静态代理和动态代理,静态代理是在程序运行前代理类的class字节码文件已经生成了,而动态代理则是在程序运行的过程中通过反射创建的。

一、静态代理

  1. 创建服务接口 

    public interface Work {
    //定义一个名字为work的方法
      void work();
    }

     

  2. 业务类实现接口,并实现接口

    public class WorkImpl implements Work{
      @Override
      public void work() {
        System.out.println("开始工作");
    
      }
    }

    3.这个类实现了工作方法,但是我们要在工作前加入吃饭,工作后加入健身的逻辑,创建代理类。

    public class WorkProxy implements Work{
      private Work work;
      public WorkProxy(final Work work) {
        this.work = work;
      }
      @Override
      public void work() {
        System.out.println("吃饭");
        work.work();
        System.out.println("进行健身");
      }
    
    }

    4.进行测试。

    public class TestProxy {
      public static void main(String[] args) {
        Work work = new WorkImpl();
        work.work();
        System.out.println("----------");
        WorkProxy workProxy = new WorkProxy(work);
        workProxy.work();
    
      }
    
    }

    测试结果:

    开始工作

    ----------

    吃饭

    开始工作

    进行健身

    优点:我们在不改变原有对象的基础上,对原来的对象进行了扩展。

    缺点:如果我们需要扩展的对象比较多,为每个对象创建代理类工作量也很大。

    二、动态代理

          使用动态代理的话,我们不需要手动创建代理类,真正的代理对象有JDK在我们使用的时候创建,我们需要编写动态处理器。

    1.动态处理器编写。

    package com.chongzi.keji.other;
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    public class DynamicProxy implements InvocationHandler{
      private Object object;
      public DynamicProxy(final Object object) {
        this.object = object;
      }
      @Override
      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("吃饭");
        Object result = method.invoke(object, args);
        System.out.println("开始健身");
        return result;
      }
    }

    2.测试类的编写。

    package com.chongzi.keji.other;
    import java.lang.reflect.Proxy;
    public class DynamicTest {
      public static void main(String[] args) {
        Work work = new WorkImpl();
        Work proxyWork = (Work)Proxy.newProxyInstance(DynamicProxy.class.getClassLoader(),
            new Class[]{Work.class},new DynamicProxy(work));
        proxyWork.work();
      }
    }

    测试结果:

    吃饭

    开始工作

    开始健身

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章