1. 程式人生 > >Java設計模式之《代理模式》及應用場景

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

out ren 場景 語句 設計模式 rgs interface 中間 args

代理模式算是我接觸較早的模式,代理就是中介,中間人。法律上也有代理,比如代理律師之類,委托人將自己的一部分權限委托給代理者,代理者就擁有被代理者(委托人)的部分權限,並且可以以被代理人的名義來實行這些權限,此時代理者與委托人等同,當然代理人也可以在實行權限時配合自己的能力來進行,當然不能超出這個權限。

  Java中的代理模式類似於上面的代理,我們也是為一個類(委托類)創建一個代理類,來代表它來對外提供功能。

  如何在Java中創建一個類的代理類呢?

  很簡單,我們需要創建一個公共接口,委托類要實現這個接口,再創建一個接口的實現類作為代理類,在這個類中的方法中可以直接調用委托類中的同名方法,外部類要進行訪問時,可以使用接口指向代理類實例,調用代理類中的方法,從而間接調用委托類中的具體方法實現。

  我們就以法律上的委托代理為例來寫個實例:

總接口:ZiRanRen

1 public interface ZiRanRen {
2     void Quanli();
3 }

委托人:MaYun

public class MaYun implements ZiRanRen {
    public void eat() {
        System.out.println("今天吃滿漢全席");
    }
    public void drink() {
        System.out.println("今天喝大西洋");
    }
    @Override
    
public void Quanli() { System.out.println("我賦予我的代理律師來行使這些權利,此時代理律師全權代理我處理某些事務"); } }

代理律師:LvShi

public class LvShi implements ZiRanRen {  
    @Override                             
    public void Quanli() {                
        new MaYun().Quanli();             
    }                                     
}                                         

測試類:Clienter

public class Clienter {                       
    public static void main(String[] args) {  
        ZiRanRen ls = new LvShi();            
        ls.Quanli();                          
    }                                         
}                                             

執行結果:

我賦予我的代理律師來行使這些權利,此時代理律師全權代理我處理某些事務

  上面是一個很簡單的例子,可以看出,我們想對外開放某些功能,就可以將這些功能在代理類中被引用,如此一來,屏蔽了我們不想外露的功能,只將我們想開放的功能開放出來。亦即委托類中其實是可以有很多方法的,很多功能的,我們可以酌情對外開放,代理類猶如一道大門,將委托類與外部調用者隔絕開來,只將部分功能賦予這個大門,來代替委托類行使這個功能,哪怕最終還是要牽扯到自身(因為最終還是要調用委托類的對應方法實現)。

  代理模式很簡單,只要記住以下關鍵點,簡單易實現:

    (1)代理類與委托類實現同一接口

    (2)在委托類中實現功能,在代理類的方法中中引用委托類的同名方法

    (3)外部類調用委托類某個方法時,直接以接口指向代理類的實例,這正是代理的意義所在:屏蔽。

  代理模式場景描述:

    (1)當我們想要隱藏某個類時,可以為其提供代理類

    (2)當一個類需要對不同的調用者提供不同的調用權限時,可以使用代理類來實現(代理類不一定只有一個,我們可以建立多個代理類來實現,也可以在一個代理類中金進行權限判斷來進行不同權限的功能調用)

    (3)當我們要擴展某個類的某個功能時,可以使用代理模式,在代理類中進行簡單擴展(只針對簡單擴展,可在引用委托類的語句之前與之後進行)

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

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