Java設計模式之《代理模式》及應用場景


原創作品,可以轉載,但是請標注出處地址: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)當我們要擴展某個類的某個功能時,可以使用代理模式,在代理類中進行簡單擴展(只針對簡單擴展,可在引用委托類的語句之前與之后進行)

  代理模式雖然實現了調用者與委托類之間的強耦合,但是卻增加了代理類與委托類之間的強耦合(在代理類中顯式調用委托類的方法),而且增加代理類之后明顯會增加處理時間,拖慢處理時間。


同系列文章:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM