国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

設計模式——代理設計模式

2019-11-09 17:19:08
字體:
來源:轉載
供稿:網友

學習了一下代理設計模式,順便記錄一下心德。 代理模式在編程中比較常見同時在生活中我們也是比較常見的,比如讓同事給帶飯,找婚介公司給籌劃婚禮,找中介公司給你把房子租出去等。 代理模式使用場景: 對一個類我們不能獲取到某個對象或者不想直接獲取某個對象時可以通過一個代理對象間接訪問該對象,委托對象與代理對象需要實現相同的接口。 代理模式的幾個角色: Subject:抽象主題類 RealSubject:具體實現類 PRoxy:代理類,持有具體實現類的引用. 代理模式分為兩種:靜態代理+動態代理。

靜態代理

在代碼運行之前代理類的class編譯文件就已經存在。 看下簡單的代碼。根據上面說的委托對象與代理對象需要實現相同的接口。接口也就少不了。

接口

public interface iprogrammer { void program();}

實現類

public class AndroidProgrammer implements IProgrammer { @Override public void program() { Log.e("程序員","寫代碼"); }}

代理類

public class ProxyProgrammer { AndroidProgrammer programmer;//持有具體實現類的引用 public ProxyProgrammer(AndroidProgrammer programmer) { this.programmer = programmer; } public void program(){ programmer.program(); Log.e("你猜這是什么","答:靜態代理"); }}

調用

AndroidProgrammer programmer=new AndroidProgrammer(); ProxyProgrammer pp=new ProxyProgrammer(programmer); pp.program();

動態代理

通過反射機制動態的生成代理者的對象。在編程過程中我們不需要知道代理誰,只有在執行階段才知道代理的誰。在java中也為我們提供了invocationHandler接口方便我們實現動態代理。

接口(同上)

public interface IProgrammer { void program();}

實現類(同上)

public class AndroidProgrammer implements IProgrammer { @Override public void program() { Log.e("程序員","寫代碼"); }}

代理類(實現InvocationHandler 接口)

public class ProgrammerHandler implements InvocationHandler { AndroidProgrammer programmer; public ProgrammerHandler(AndroidProgrammer programmer) { this.programmer = programmer; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { programmer.program(); Log.e("你猜這是什么","答:動態代理"); return null; }}

調用

AndroidProgrammer programmer=new AndroidProgrammer(); ProgrammerHandler invocation=new ProgrammerHandler(programmer); IProgrammer ip= (IProgrammer) Proxy.newProxyInstance(AndroidProgrammer.class.getClassLoader(),new Class[]{IProgrammer.class},invocation); //也可以這么寫// IProgrammer ip= (IProgrammer) Proxy.newProxyInstance(AndroidProgrammer.class.getClassLoader(),programmer.getClass().getInterfaces(),invocation); ip.program();

小結

總體來講代理設計模式基本沒什么缺點并且應用廣泛,Android源碼中的ActivityManagerService就使用到了代理設計模式。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临潭县| 米泉市| 中宁县| 雷波县| 吉林省| 疏勒县| 远安县| 通山县| 大冶市| 开远市| 永康市| 承德市| 乌拉特后旗| 德惠市| 金沙县| 衡水市| 龙泉市| 江安县| 饶阳县| 新巴尔虎左旗| 金昌市| 临汾市| 汕头市| 深圳市| 西吉县| 龙泉市| 汤阴县| 满洲里市| 定边县| 文安县| 成都市| 突泉县| 元氏县| 阳谷县| 陆川县| 巫山县| 新津县| 鸡西市| 柏乡县| 盐边县| 莎车县|