庫克:iPhone 在印度只佔很少的份額,蘋果將開設零售店來搶佔市場
阿新 • • 發佈:2021-09-20
代理模式
典型應用場景 房東 中介 租房者,中介就作為房東的代理與租房者溝通,提供附加訊息
- 靜態代理模式,每個房東都必須建立一個代理類,實現簡單但是程式碼冗餘重複很多
- 租房介面實現
package com.gof23.proxy1.demo1;
public interface Rent {
void zf();
}
- 房東實現租房介面
package com.gof23.proxy1.demo1; public class Host implements Rent { public void zf(){ System.out.println("我要租房"); } }
- 代理實現租房介面同時組合租房介面
package com.gof23.proxy1.demo1;
public class Proxy implements Rent{
private Rent rent;
public void setRent(Rent rent){
this.rent = rent;
}
@Override
public void zf() {
rent.zf();
}
}
- 租客租房測試
package com.gof23.proxy1.demo1; public class Client { public static void main(String[] args) { Host host = new Host(); Proxy proxy = new Proxy(); proxy.setRent(host); proxy.zf(); } }
- jdk動態代理模式,實現動態代理,對所有的代理物件只要一個代理類
- 動態代理類
package com.gof23.proxy1.demo2; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyVocationHandler implements InvocationHandler { private Object target; public void setTarget(Object obj){ this.target = obj; } public Object getProxy(){ return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(),this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return method.invoke(target,args); } }
- 租客實現租房
package com.gof23.proxy1.demo2;
public class Client {
public static void main(String[] args) {
Host host = new Host();
ProxyVocationHandler proxyVocationHandler = new ProxyVocationHandler();
proxyVocationHandler.setTarget(host);
Rent rent = (Rent)proxyVocationHandler.getProxy();
rent.zf();
}
}
小結: 動態代理相當重要,大部分框架底層都會用到動態代理,有spring、mybatis等,動態代理實現可以作為你的工具類