设计模式-代理模式

简介

生活中或多代理(中介也算).市面上的链家、中原网等。客户直接面向的是代理,无需跟目标老板交涉java

代理模式也是如此,简单讲代理模式分静态、动态两种ide

静态代理

先画个UML关系图.这个能更直观的表达函数

package com.fumeck.general;

public class Client {
    public void excute(){
        System.out.println("客户:我须要租房子");
    }
}
package com.fumeck.general;

public class ProxyMan {
    private Client client;

    public ProxyMan(Client client) {
        this.client = client;
    }

    public void excute(){
        System.out.println("代理人:你好我来了");
        client.excute();
        System.out.println("代理人:OK,包在我身上");
    }
}
package com.fumeck.general;

public class Demo {
    public static void main(String[] args) {
        Client client = new Client();
        ProxyMan proxyMan = new ProxyMan(client);
        proxyMan.excute();
    }
}

控制台输出:this

    代理人:你好我来了
    客户:我须要租房子
    代理人:OK,包在我身上spa

优势:采用了聚合的方式。经过构建函数建立代理对象时传入客户对象便可代理

确实:灵活性不够,若是代理十个事件就得写是个方法code

动态代理

动态代理又分为两种:对象

1.基于接口的Jdk动态代理

jdk就自带动态代理。位于java.lang.reflect的包下,这样就不难理解.动态代理就是运用反射的原理来实现的,若是对Java反射的没有必定的基础,建议先学一学接口

InvocationHandler接口是核心接口。他只有一个方法invoke(Object object,Method method,Object[] args)事件

public interface SubjectI {
    void excute();
}
public class Client implements SubjectI{
    @Override
    public void excute() {
        System.out.println("我要找房子");
    }
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class ProxyMan implements InvocationHandler{
    private SubjectI subjectI;

    public ProxyMan(SubjectI subjectI) {
        this.subjectI = subjectI;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("尼玛");
        Object o = method.invoke(subjectI,args);
        System.out.println("你妹");
        return o;
    }
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class Demo {
    public static void main(String[] args) throws Throwable {
        Demo demo =new Demo();
        InvocationHandler s=new ProxyMan(new Client());
        SubjectI proxy = (SubjectI) Proxy.newProxyInstance(demo.getClass().getClassLoader(),new Class[]{SubjectI.class},s);
        proxy.excute();
    }
}

2.cglib动态代理

相关文章
相关标签/搜索