首先我們應該了解一下代理模式的概念:
一個接口,兩個子類分别實作它,一個子類全程做的是輔助,架構的作用,另一個做的是真正的要做的事
下面我要舉個例子來解釋一下我對代理模式的了解:
假設客戶要去買一杯奶茶,奶茶店員并不知道他要的什麼口味的,紅豆、巧克力、香草、原味、芒果、藍莓等等,店員要做的就是加入各種口味的調味品,加熱奶茶,并且裝入奶茶杯中,最後與客戶達成交易。在這個例子中,客戶跟店員就是兩個子類,前者完成主要業務(決定奶茶的最終口味),後者完成相關輔助業務,核心功能就是買奶茶,是個接口,下面先實作一下功能。
首先寫個接口,簡單來說就是:買奶茶這個事情;
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();
}
}
最終結果::