JAVA模式之代理模式

平時一直在用spring,spring中最大的特效IOC和AOP,其中AOP使用的就是代理模式.閒着無聊,隨手寫了一個代理模式,也記錄下代理模式的實現Demo.java

好比如今有一個場景是:客戶想要增長一個新的功能,按照流程應該是客戶通知苦逼程序員增長功能,可是有一個問題,程序員並不清楚功能合理性與否,因此流程變爲,客戶找到項目經理,項目經理評估後,決定要作,則通知程序員加班作出來...程序員

在這個場景中,使用者是客戶,實現者是程序員,代理角色則是項目經理.代理模式簡單來講就是使用者須要實現一個功能,可是不關心底層由誰實現,經過代理類能夠自動匹配實現類的實現方法.好比在某些方法上須要作一些預處理,在代理類中,能夠統一添加.好比上邊例子,項目經理須要作一個時間統計,若是不用動態代理,有100個方法的話,就須要寫100次相同的代碼,極其麻煩.通常實現有兩種方式:靜態代理和動態代理,這裏只寫動態代理.spring

代碼以下:ide

功能接口:ICoder.java測試

public interface ICoder {
    public abstract void implDemands(String demandName);
}this

功能實現類:Coder.java.net

public class Coder implements ICoder {
    private String name;
    
    public Coder(String name) {
        this.name = name;
    }
    
    @Override
    public void implDemands(String demandName) {
        System.out.println(name + "用JAVA實現了" + demandName + "的需求!");
    }
}代理

代理類:ProxyCoder.javacode

須要實現InvocationHandler接口,實現其中的方法invoke接口

public class ProxyCoder implements InvocationHandler{
    private ICoder coder;
    
    public ProxyCoder(ICoder coder) {
        this.coder = coder;
    }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        Object result = method.invoke(coder, args);
        return result;
    }
}

測試類:

public static void main(String[] args) {
        ICoder coder = new Coder("張三");
        InvocationHandler proxyCoder = new ProxyCoder(coder);
        ClassLoader classLoader = coder.getClass().getClassLoader();
        ICoder proxy = (ICoder)Proxy.newProxyInstance(classLoader, coder.getClass().getInterfaces(), proxyCoder);
        proxy.implDemands("張經理");
    }

即實現動態代理.

相關文章
相關標籤/搜索