编程语言
首页 > 编程语言> > 基于JAVA的设计模式之代理模式

基于JAVA的设计模式之代理模式

作者:互联网

    王宝强有一个经纪人叫宋喆,这个经纪人很吊,可以代理王宝强做一系列的事情,与粉丝活动、王宝强的微博维护、安排王宝强的行程以及什么什么等等。如果王宝强一个人做岂不是累死。通过这个代理人为王宝强节省了不少。

    代理模式就是在不改变原有类的代码结构上为类拓展新的功能。

  

//原类与代理类的公共接口
public interface Subject {
    public void request();
}

public class RealSubject implements Subject{

    public void request() {
        System.out.println("王宝强拍电影");
    }
}

public class Proxy implements Subject {
    private Subject realSubject;

    public void setRealSubject(Subject realSubject) {
        this.realSubject = realSubject;
    }

    public void request() {
        System.out.println("宋喆代替王宝强维护微博");
        realSubject.request();
        System.out.println("宋喆代替王宝强与粉丝互动");
    }
}

public class Main {
    public static void main(String[] args) {
        Subject realSubject=new RealSubject();
        Proxy proxy=new Proxy();
        proxy.setRealSubject(realSubject);
        proxy.request();
    }
}
public interface Subject {
    public void request();
}

public class RealSubject implements Subject {
    public void request() {
        System.out.println("王宝强拍电影");
    }
}

public class ProxyMain {
    public static void main(String[] args) {
        final RealSubject realSubject=new RealSubject();
        Subject proxy=(Subject) Proxy.newProxyInstance(
                /**
                 * ClassLoader 被代理类的加载器
                 * Interfaces 代理对象与被代理对象公共接口
                 * InvocationHandle 事件处理
                 */
                realSubject.getClass().getClassLoader(),
                realSubject.getClass().getInterfaces(),
                new InvocationHandler() {
                    public Object invoke(Object proxy, Method method, Object[] args)
                            throws Throwable {
                        System.out.println("宋喆代替王宝强维护微博");
                        Object returnValue=method.invoke(realSubject,args);
                        System.out.println("宋喆代替王宝强与粉丝互动");
                        return returnValue;
                    }
                }
        );
        proxy.request();
    }
}
public class RealSubject {
    public void request() {
        System.out.println("王宝强拍电影");
    }
}

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class ProxyFactory implements MethodInterceptor {
    private Object realSubject;
    public ProxyFactory(Object realSubject){
        this.realSubject=realSubject;
    }
    public Object getProxyInstance(){
        //1.工具类
        Enhancer enhancer=new Enhancer();
        //2.设置父类
        enhancer.setSuperclass(realSubject.getClass());
        //3.设置回调函数
        enhancer.setCallback(this);
        //4.创建子类
        return enhancer.create();
    }
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
            throws Throwable {
        System.out.println("宋喆代替王宝强维护微博");
        Object returnValue=method.invoke(realSubject,objects);
        System.out.println("宋喆代替王宝强与粉丝互动");
        return returnValue;
    }
}

public class Main {
    public static void main(String[] args) {
        RealSubject realSubject=new RealSubject();
        RealSubject proxy=
                (RealSubject)new ProxyFactory(realSubject)
                .getProxyInstance();
        proxy.request();
    }
}

标签:JAVA,void,Object,代理,王宝强,proxy,realSubject,设计模式,public
来源: https://www.cnblogs.com/hbsdljz/p/11077377.html