天天看點

JavaSE階段必須掌握的23種設計模式之一:代理設計模式

首先我們應該了解一下代理模式的概念:

一個接口,兩個子類分别實作它,一個子類全程做的是輔助,架構的作用,另一個做的是真正的要做的事

下面我要舉個例子來解釋一下我對代理模式的了解:

假設客戶要去買一杯奶茶,奶茶店員并不知道他要的什麼口味的,紅豆、巧克力、香草、原味、芒果、藍莓等等,店員要做的就是加入各種口味的調味品,加熱奶茶,并且裝入奶茶杯中,最後與客戶達成交易。在這個例子中,客戶跟店員就是兩個子類,前者完成主要業務(決定奶茶的最終口味),後者完成相關輔助業務,核心功能就是買奶茶,是個接口,下面先實作一下功能。

首先寫個接口,簡單來說就是:買奶茶這個事情;

interface MilkyTea{
    public void buyMilkyTea();
}
           

第二步:第一個子類,顧客類。決定奶茶最終口味

class MilkyTeaTaste implements MilkyTea{
    public void buyMilkyTea(){
        System.out.println("要一杯巧克力口味的");
    }
}
           

第三部,第二個子類,代理類,奶茶店員,完成奶茶的輔助操作

class MilkyTeaEmplyee implements MilkyTea{
    private MilkyTea milktea;
    public MilkyTeaEmplyee(MilkyTea milktea){
        this.milktea = milktea;
    }
    //店員要做的相關操作
    public void joinCondiments(){
        System.out.println("加入調味品");
    }
    public void heatMilkyTea(){
        System.out.println("加熱奶茶");
    }
    public void packMilkTea(){
        System.out.println("裝入杯中");
    }
    //覆寫接口方法:全程動作在此方法中完成
    public void buyMilkyTea(){
        this.milktea.buyMilkyTea();
        this.joinCondiments();
        this.heatMilkyTea();
        this.packMilkTea();
    }
}
           

下面是主類(終端用戶端)中的操作

public class Test1{
    public static void main(String[] args){
        new MilkyTeaEmplyee(new MilkyTeaTaste()).buyMilkyTea();    
    }
}
           

到此,一個簡單的代理模式就介紹完畢了,下面我将總結一下代理模式的相關特點及其本質

第一點::為什麼在終端中店員類(代理類)裡要傳入一個顧客口味類?

因為,代理類做的隻是奶茶制作過程當中的輔助操作,真正決定奶茶口味的,還是需要顧客來決定,是以必須在店員類裡傳入顧客口味;

第二點::為什麼店員類中要執行個體化一個接口對象,而不是直接使用顧客的口味類對象?

因為如果直接執行個體化顧客口味對象的話,太局限,僅僅能造一個口味的,如果執行個體化一個接口,那麼在代理類構造方法中傳入顧客口味對象時會發生向上轉型,不同的口味都可以使用這個輔助類,可以靈活實作這個功能;

第三點::為啥在主用戶端中,執行個體化的是一個輔助子類?

因為,将要調用的是覆寫之後的 buyMilkyTea() 操作。如果執行個體化客戶口味類,就隻剩一個 buyMilkyTea() 方法了。

下面是加入第二個(紅豆的)口味後的:

//首先,寫個接口
interface MilkyTea{
    public void buyMilkyTea();
}
//然後就是第一個子類,決定什麼口味的奶茶
class MilkyTeaTaste implements MilkyTea{
    public void buyMilkyTea(){
        System.out.println("要一杯巧克力口味的");
    }
}
class MilkyTeaTaste2 implements MilkyTea{
    public void buyMilkyTea(){
        System.out.println("要一杯紅豆口味的奶茶");
    }
}
//下面事第二個子類(店員),用來輔助這個過程
class MilkyTeaEmplyee implements MilkyTea{
    private MilkyTea milktea;
    public MilkyTeaEmplyee(MilkyTea milktea){
        this.milktea = milktea;
    }
    public void joinCondiments(){
        System.out.println("加入調味品");
    }
    public void heatMilkyTea(){
        System.out.println("加熱奶茶");
    }
    public void packMilkTea(){
        System.out.println("裝入杯中");
    }
    public void buyMilkyTea(){
        this.milktea.buyMilkyTea();
        this.joinCondiments();
        this.heatMilkyTea();
        this.packMilkTea();
    }
}
public class Test1{
    public static void main(String[] args){
        new MilkyTeaEmplyee(new MilkyTeaTaste()).buyMilkyTea();
        new MilkyTeaEmplyee(new MilkyTeaTaste2()).buyMilkyTea();
    }
}
           

最終結果::

JavaSE階段必須掌握的23種設計模式之一:代理設計模式