JavaSE之面向物件程式設計—抽象類與介面—— 5(代理設計模式)
代理設計模式
一、代理設計模式
代理設計模式:就是兩個子類共同實現一個介面,其中一個子類負責真實業務實現,另外一個子類完成輔助性功能。
下面我們通過例子講解我們的代理模式:
//代理設計模式 //送花:張三需要送花給李四,但是又不要自己送花,通過快遞員給李四送花 interface SendFlower{ public void sendFlower(); } //這是我們真正的類,就是主要的 class BoyFirend implements SendFlower{ public void sendFlower(){ System.out.println("張三送給李四的花"); } } //這是我們的代理,快遞員 class ProxyBoyFirend implements SendFlower{ //首先我們需要知道的是,快遞源在給李四送花的過程中,需要先打電話確認 //在確認有人的情況下,再去給李四送花——代替張三實現這個過程 //送完花以後還需要簽收 private SendFlower sendPeople;//這個是真正的操作業務,宣告物件 public ProxyBoyFirend(SendFlower sendPeople){//這個代理類的構造方法我們需要將真正業主的名字傳進去 this.sendPeople=sendPeople;//構造方法中的含參定義為這樣這為了後面呼叫真正的實現方法 } public void Tel(){ System.out.println("打電話確認這個時間段是否有人"); } public void Write(){ System.out.println("收到花以後簽字"); } //這個方法是為了讓這個代理業務形成一個流水線,只要建立物件那麼就將這個方法執行一下 public void sendFlower(){//代理物件對介面中抽象方法的重寫就是將整個過程都寫進這個方法中 this.Tel(); this.sendPeople.sendFlower();//真實操作業務:這個業務的定義是在介面中的,但是我們在真正的操作者中 //對他進行了例項化,所以我們只能通過真正的操作者才能呼叫這個函式。 this.Write(); } } class Factory{ public static SendFlower getInstance(){//這個方法我們是為了實現返回真正的物件 return new ProxyBoyFirend(new BoyFirend()); } } public class Daili{ public static void main(String[] args){ //在這我們只需要通過代理物件來操作這個過程即可 SendFlower sd=Factory.getInstance(); sd.sendFlower(); } }
代理模式的實現原理:首先我們將一個需要實現的過程抽象為一個方法,將這個方法放在介面中,然後分別用兩個類來實現介面中的這個方法。第一個類只是覆寫這個方法實現介面,這個類叫做真正的操作類;然後是第二個類叫代理類,這個類將實現這個過程所有需要考慮的因素都考慮在裡面,在這個類裡面首先需要需要宣告一個真正業務的物件,因為需要通過這個真正的業務去實現真正的操作過程。然後再定義這個代理類的構造方法,這個構造方法是含參構造方法,這個引數就是真正的業務物件,目的是為了可以實現在這個類的後面呼叫真正業務類中的方法;然後在這個代理類中繼續定義輔助方法,最後覆寫介面中的方法 ,這個方法裡面就將代理的整個過程寫進去,就是通過this呼叫方法,在實現真正的業務的時候就是通過我們剛才的構造方法就可以實現它的呼叫。代理類完了就是一個工廠類,這個類裡面只定義一個方法,這個方法只是建立了代理類的一個匿名物件並且返回。最後我們在主方法中,只需要建立介面的物件,這個物件通過工廠類呼叫它裡面的方阿飛,返回的是代理類的物件,實現的是向上轉型。然後呼叫介面中的方法,即可實現這個過程。
二、抽象類與介面的區別
我們將從結構組成、許可權、子類使用、關係、子類限制來進行對比:
(1)結構組成:抽象類:抽象方法+普通方法組成;
介面:抽象方法+全域性常量(static final)
(2)許可權: 抽象類:各種許可權
介面:public
(3)關係: 抽象類:一個抽象類可以實現多個介面
介面:不能實現抽象類。可以通過extends繼承多個介面。
(4)子類限制: 抽象類:一個類只能繼承一個類
介面:一個類可以實現多個介面。