設計模式-代理模式

簡介

生活中或多代理(中介也算).市面上的鏈家、中原網等。客戶直接面向的是代理,無需跟目標老闆交涉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動態代理

相關文章
相關標籤/搜索