结构型模式:代理模式
所謂代理模式,其實就是一個執行實體對于另一個目的實體的動作,轉換為某個中間實體對于目的實體的動作,但動作本質還是執行實體發出的。而這個中間實體就是我們的代理。
舉個例,A讓B幫他向C傳達自己的愛意。這里B就是A的代理!
代理模式的實現是在代理類中添加執行實體的引用,然后代理類和執行實體具有相同的動作接口。
執行實體類中含有目的實體的對象,通過代理類的執行實體的接口調用,從而間接地對目的實體進行操作。
舉個例子:vae幫jay向teayeon送禮物!
class schoolgirl {string name; public:schoolgirl(const string & str) :name(str) {}void show() { cout << name << ","; } };class action { public:virtual void givedoll() = 0;virtual void giveflowers() = 0;virtual void givechocolate() = 0; };class pursuit:public action {schoolgirl mm; public:pursuit(const schoolgirl & sg):mm(sg){}void givedoll() { mm.show(); cout << "送你玩具" << endl; }void giveflowers() { mm.show(); cout << "送你鮮花" << endl; }void givechocolate() { mm.show(); cout << "送你巧克力" << endl; } };class proxy:public action {pursuit* ps; public:proxy(const schoolgirl& sg) { ps = new pursuit(sg); }void givedoll() { ps->givedoll(); }void giveflowers() { ps->giveflowers(); }void givechocolate() { ps->givechocolate(); }};int main() {schoolgirl mm("teayeon");proxy vae(mm);vae.givedoll();vae.giveflowers();vae.givechocolate();system("pause");return 0; }設計模式是一門藝術,如果真正了解這門藝術,你會發現,世界都將變得更加優美。
定義
為其它的對象提供一種代理,以控制這個對象的訪問
使用場景
當不想直接訪問某個對象的時候,就可以通過代理(類似于Nginx代理服務器一樣)
?
?
package staticProxy;
public interface Star {
??? void plan();
??? void talk();
??? void sell();
??? void sing();
??? void rich();
}
經紀人計劃開始演唱會
經紀人找合作人談條件
經紀人找人賣票
周杰倫唱歌
經紀人收錢
動態代理
使用動態代理JDK代理
(1)InvocationHandler接口
在使用動態代理時,我們需要定義一個位于代理類與委托類之間的中介類,這個中介類被要求實現InvocationHandler接口,這個接口的定義如下:
1.? public?interface?InvocationHandler?{?
2.? ?
3.? Object?invoke(Object?proxy,?Method?method,?Object[]?args);?
4.? ?
5.? }?
從InvocationHandler這個名稱我們就可以知道,實現了這個接口的中介類用做“調用處理器”。當我們調用代理類對象的方法時,這個“調用”會轉送到invoke方法中,代理類對象作為proxy參數傳入,參數method標識了我們具體調用的是代理類的哪個方法,args為這個方法的參數。這樣一來,我們對代理類中的所有方法的調用都會變為對invoke的調用,這樣我們可以在invoke方法中添加統一的處理邏輯(也可以根據method參數對不同的代理類方法做不同的處理)。因此我們只需在中介類的invoke方法實現中輸出“before”,然后調用委托類的invoke方法,再輸出“after”。下面我們來一步一步具體實現它。
?
?
1.? @Override?
2.? ?
3.? public?Object?invoke(Object?proxy,?Method?method,?Object[]?args)?throws?Throwable?{?
4.? ?
5.? System.out.println("before");?
6.? ?
7.? Object?result?=?method.invoke(obj,?args);?
8.? ?
9.? System.out.println("after");?
10. ?
11. return?result;?
12. ?
13. }?
14. ?
15. }?
?
實現:
package dynamicProxy;
//接口
public interface Star {
??? void plan();
??? void talk();
??? void sell();
??? void sing();
??? void rich();
}
package dynamicProxy;
//目標類
public class RealStar implements?Star {
??? @Override
??? public void plan() {
??? }
??? @Override
??? public void talk() {
??? }
??? @Override
??? public void sell() {
??? }
??? @Override
??? public void sing() {
??????? System.out.println("周杰倫唱歌");
??? }
??? @Override
??? public void rich() {
??? }
}
package dynamicProxy;
import observer.Observer;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//動態代理類
public class StarHandler implements?InvocationHandler {
?
??? private Star realstar;
??? public StarHandler(Star realstar) {
??????? this.realstar = realstar;
??? }
??? @Override
??? public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
??????? Object object = null;
??????? System.out.println("代理人談條件");
??????? System.out.println("代理人找人賣票");
??????? if (method.getName().equals("sing")) {
??????????? object = method.invoke(realstar, args);
??????? }
??????? System.out.println("代理人收錢");
??????? return object;
??? }
}
package dynamicProxy;
import java.lang.reflect.Proxy;
public class Test {
??? public static void main(String[] args) {
??????? Star realStar = new RealStar();
??????? StarHandler starHandler = new StarHandler(realStar);
??????? Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),new Class[]{Star.class}, starHandler);
??????? proxy.sing();
??? }
}
總結
以上是生活随笔為你收集整理的结构型模式:代理模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单了解一下函数模板
- 下一篇: 工厂方法模式和简单工厂模式的区别