代理模式(Proxy Pattern)

一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

UML Class Diagram

代理模式(Proxy Pattern)_第1张图片

Implementation

package OriginalClasses;

/**
 * Created by DELL
 * Date: 2019/9/28.
 * Time: 14:33
 */
public abstract class Subject {
    public abstract void doSomeWork();
}
package OriginalClasses;

/**
 * Created by DELL
 * Date: 2019/9/28.
 * Time: 14:37
 */
public class ConcreteSubject extends Subject {
    @Override
    public void doSomeWork() {
        System.out.println("I am from concrete subject");
    }
}
package ProxyClasses;

import OriginalClasses.ConcreteSubject;
import OriginalClasses.Subject;

/**
 * Created by DELL
 * Date: 2019/9/28.
 * Time: 14:34
 */
public class Proxy extends Subject {
    ConcreteSubject cs;
    @Override
    public void doSomeWork() {
        System.out.println("Proxy call happening now");
        //lazy initialization
        if(cs == null){
            cs = new ConcreteSubject();
        }else{
            cs.doSomeWork();
        }
    }
}

package proxy.pattern.demo;

import ProxyClasses.Proxy;

/**
 * Created by DELL
 * Date: 2019/9/28.
 * Time: 14:35
 */
public class ProxyPatternEx {
    public static void main(String[] args) {
        System.out.println("***Proxy Pattern Demo***");
        Proxy proxy = new Proxy();
        proxy.doSomeWork();
    }
}


代理模式再学习

代理模式 2.0 时间(20-8-22)

  1. 静态代理
package com.example.bao1;



//创建一个接口
interface Subject {
    void doSomeWork();
}

//创建目标类

class ConCreateSbuject implements Subject{
    @Override
    public void doSomeWork() {
        System.out.println("目标类的dosomeWork() 方法被调用");
    }
}

//创建代理类

class ProxySubject implements Subject{
      Subject cs;


    ProxySubject(Subject cs) {
        this.cs = cs;
    }

    @Override
    public void doSomeWork() {
        //调用目标类的方法
        System.out.println("代理类执行前");
        cs.doSomeWork();
        System.out.println("代理类执行前");

    }
}

public class Client{
    public static void main(String[] args) {
        Subject cs = new ConCreateSbuject();
        ProxySubject proxySubject = new ProxySubject(cs);
        proxySubject.doSomeWork();
    }
}
  1. 使用JDK 动态代理

主要依靠下面三个类实现动态代理

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

package com.example.bao2;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;


//创建一个接口
interface Subject {
    void doSomeWork();
}

//创建目标类

class ConCreateSbuject implements Subject {
    @Override
    public void doSomeWork() {
        System.out.println("目标类的dosomeWork() 方法被调用");
    }
}

//创建代理类

class ProxyFactory  {
    Subject cs;
    ProxyFactory(Subject cs){
        this.cs = cs;
    }

    public Proxy getProxyInstane(){
       return (Proxy) Proxy.newProxyInstance(cs.getClass().
               getClassLoader(),cs.getClass().getInterfaces(),new MyHanlder(cs));

    }

}

class MyHanlder implements InvocationHandler{
    Subject cs;
    MyHanlder(Subject cs){
        this.cs = cs;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("调用代理类的invoke");
        Object reValue = method.invoke(cs,args);
        System.out.println("目标类方法执行后");
        return reValue;
    }
}
//
public class Client{
    public static void main(String[] args) {
        Subject targetSuject = new ConCreateSbuject();

        ProxyFactory proxyFactory = new ProxyFactory(targetSuject);
        Subject proxyInstane = (Subject) proxyFactory.getProxyInstane();
        proxyInstane.doSomeWork();

    }
}
  1. cglib实现动态代理
  • 目标类无需实现接口,创建目标类的子例实现动态代理

  • 目标类方法不能是static 和final

  • 重新interceptor方法

引入依赖

<dependency>
  <groupId>org.springframeworkgroupId>
  <artifactId>spring-contextartifactId>
  <version>5.2.8.RELEASEversion>
dependency>

类图
代理模式(Proxy Pattern)_第2张图片

代码实现

package com.example.bao3;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class Client {
    public static void main(String[] args) {
        //创建目标类
        ConCreateSuject ts = new ConCreateSuject();
        //创建代理对象
        ConCreateSuject proxyInstance = (ConCreateSuject) new ProxyFactory(ts).getProxyInstance();
        //代理对象调用dosomeWork 方法
        proxyInstance.doSomeWork();
    }
}

//创建目标类
class ConCreateSuject{
    public void doSomeWork(){
        System.out.println("目标类执行的doSomeWork()方法");
    }
}

//创建代理类
class ProxyFactory implements MethodInterceptor {
    //引入目标类
    private ConCreateSuject cs;

    public ProxyFactory(ConCreateSuject cs) {
        this.cs = cs;
    }

    public Object getProxyInstance(){
        //1. 创建工具类
        Enhancer enhancer = new Enhancer();
        //2.设置父类
        enhancer.setSuperclass(cs.getClass());
        //3.设置回调函数(就是它本身)
        enhancer.setCallback(this);
        //4.返回代理对象
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("使用cglib 执行前");
        Object reValue = method.invoke(cs, objects);
        System.out.println("使用cglib 执行前");
        return reValue;
    }
}

你可能感兴趣的:(设计模式)