原創作品,可以轉載,但是請標注出處地址:http://www.cnblogs.com/V1haoge/p/6525527.html
代理模式算是我接觸較早的模式,代理就是中介,中間人。法律上也有代理,比如代理律師之類,委托人將自己的一部分權限委托給代理者,代理者就擁有被代理者(委托人)的部分權限,並且可以以被代理人的名義來實行這些權限,此時代理者與委托人等同,當然代理人也可以在實行權限時配合自己的能力來進行,當然不能超出這個權限。
Java中的代理模式類似於上面的代理,我們也是為一個類(委托類)創建一個代理類,來代表它來對外提供功能。
如何在Java中創建一個類的代理類呢?
很簡單,我們需要創建一個公共接口,委托類要實現這個接口,再創建一個接口的實現類作為代理類,在這個類中的方法中可以直接調用委托類中的同名方法,外部類要進行訪問時,可以使用接口指向代理類實例,調用代理類中的方法,從而間接調用委托類中的具體方法實現。
我們就以法律上的委托代理為例來寫個實例:
總接口:ZiRanRen
1 public interface ZiRanRen { 2 void Quanli(); 3 }
委托人:MaYun
1 public class MaYun implements ZiRanRen { 2 public void eat() { 3 System.out.println("今天吃滿漢全席"); 4 } 5 public void drink() { 6 System.out.println("今天喝大西洋"); 7 } 8 @Override 9 public void Quanli() { 10 System.out.println("我賦予我的代理律師來行使這些權利,此時代理律師全權代理我處理某些事務"); 11 } 12 }
代理律師:LvShi
1 public class LvShi implements ZiRanRen { 2 @Override 3 public void Quanli() { 4 new MaYun().Quanli(); 5 } 6 }
測試類:Clienter
1 public class Clienter { 2 public static void main(String[] args) { 3 ZiRanRen ls = new LvShi(); 4 ls.Quanli(); 5 } 6 }
執行結果:
我賦予我的代理律師來行使這些權利,此時代理律師全權代理我處理某些事務
上面是一個很簡單的例子,可以看出,我們想對外開放某些功能,就可以將這些功能在代理類中被引用,如此一來,屏蔽了我們不想外露的功能,只將我們想開放的功能開放出來。亦即委托類中其實是可以有很多方法的,很多功能的,我們可以酌情對外開放,代理類猶如一道大門,將委托類與外部調用者隔絕開來,只將部分功能賦予這個大門,來代替委托類行使這個功能,哪怕最終還是要牽扯到自身(因為最終還是要調用委托類的對應方法實現)。
代理模式很簡單,只要記住以下關鍵點,簡單易實現:
(1)代理類與委托類實現同一接口
(2)在委托類中實現功能,在代理類的方法中中引用委托類的同名方法
(3)外部類調用委托類某個方法時,直接以接口指向代理類的實例,這正是代理的意義所在:屏蔽。
代理模式場景描述:
(1)當我們想要隱藏某個類時,可以為其提供代理類
(2)當一個類需要對不同的調用者提供不同的調用權限時,可以使用代理類來實現(代理類不一定只有一個,我們可以建立多個代理類來實現,也可以在一個代理類中金進行權限判斷來進行不同權限的功能調用)
(3)當我們要擴展某個類的某個功能時,可以使用代理模式,在代理類中進行簡單擴展(只針對簡單擴展,可在引用委托類的語句之前與之后進行)
代理模式雖然實現了調用者與委托類之間的強耦合,但是卻增加了代理類與委托類之間的強耦合(在代理類中顯式調用委托類的方法),而且增加代理類之后明顯會增加處理時間,拖慢處理時間。
同系列文章:
- Java設計模式之《適配器模式》及應用場景
- Java設計模式之《外觀模式》及應用場景
- Java設計模式之《橋接模式》及應用場景
- Java設計模式之《單例模式》及應用場景
- Java設計模式之《觀察者模式》及應用場景
- Java設計模式之《調停者模式》及應用場景
- Java設計模式之《代理模式》及應用場景
- Java設計模式之《職責鏈模式》及應用場景
- Java設計模式之《享元模式》及應用場景
- Java設計模式之《構建者模式》及應用場景
- Java設計模式之《模板模式》及使用場景
- Java設計模式之《裝飾器模式》及應用場景
- Java設計模式之《工廠方法模式》及使用場景
- Java設計模式之《抽象工廠模式》及使用場景