設計模式--代理模式
Proxy Pattern,23種常用的面向對象軟件的設計模式之一。(設計模式的說法源自《設計模式》一書,原名《Design Patterns: Elements of Reusable Object-Oriented Software》。1995年出版,出版社:Addison Wesly Longman.Inc。該書提出了23種基本設計模式,第一次將設計模式提升到理論高度,並將之規範化。)
1 代理模式定義
為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
2 優點
(1).職責清晰
真實的角色就是實現實際的業務邏輯,不用關心其他非本職責的事務,通過後期的代理完成一件完成事務,附帶的結果就是編程簡潔清晰。(2).代理對象可以在客戶端和目標對象之間起到中介的作用,這樣起到了中介的作用和保護了目標對象的作用。
(3).高擴展性
3 代理模式實現
代理模式主要是多態的體現,代理對象與被代理對象都實現與同一個接口(保證雙方能做一樣的事情),再由代理對象幹被代理對象的活
1)定義一個公用的上級接口CommonPerson,定義shopping()、bringFood()等方法
2)定義代理對象ProxyPersonA類與被代理對象ProxiedPersonB類,都實現CommonPerson接口,實現所有方法
3)定義調用方Caller類,訪問代理對象,卻調用的是被代理對象的方法,實現代理模式
4 動態代理與靜態代理
代理模式分為靜態代理、動態代理。
1)靜態代理是由程序員創建或工具生成代理類的源碼,再編譯代理類。所謂靜態也就是在程序運行前就已經存在代理類的字節碼文件,代理類和委托類的關系在運行前就確定了。
2)動態代理是在實現階段不用關心代理類,而在運行階段才指定哪一個對象。
5 代碼實現
5.1 統一上級接口
/** * @Description: 統一上級接口(讓代理對象與被代理對象擁有同樣的方法才能做同樣的事情) * @Author: qiuxx * @Date: 19:48 2018/6/18 */ public interface CommonPerson { /** * 購物 */ public void shopping(); /** * 帶飯 */ public void bringFood(); }
5.2 代理(與被代理)對象
/**
* @Description: 代理對象A
* @Author: qiuxx
* @Date: 19:50 2018/6/18
*/
public class ProxyPersonA implements CommonPerson {
private CommonPerson commonPerson;
private ProxyPersonA(){
}
public ProxyPersonA(CommonPerson commonPerson){
this.commonPerson = commonPerson;
}
@Override
public void shopping() {
this.commonPerson.shopping();
}
@Override
public void bringFood() {
this.commonPerson.bringFood();
}
}
/**
* @Description: 被代理對象B
* @Author: qiuxx
* @Date: 19:50 2018/6/18
*/
public class ProxiedPersonB implements CommonPerson {
@Override
public void shopping() {
System.out.println("我是被代理的對象B,現在出去購物去");
}
@Override
public void bringFood() {
System.out.println("我是被代理的對象B,現在幫別人帶飯去");
}
}
5.3 調用方Caller
/**
* @Description: 調用方(訪問代理對象方法,做被代理對象的事情)
* @Author: qiuxx
* @Date: 19:55 2018/6/18
*/
public class Caller {
public static void main(String[] args){
ProxiedPersonB proxiedPersonB = new ProxiedPersonB();//被代理對象B
//創建代理對象A
ProxyPersonA proxyPersonA = new ProxyPersonA(proxiedPersonB);
//看似在訪問代理對象A的方法,實際是調用了被代理對象B的方法
proxyPersonA.shopping();
proxyPersonA.bringFood();
}
}
博客地址:https://qiuxx404.github.io/2018/06/18/原創/設計模式/設計模式-代理模式
設計模式--代理模式