代理模式(ProxyPattern),設計模式中很重要的一個思想,可以讓代碼看起來更簡潔化,在生活中代理模式也很多,比如租房找中介,中介找房東.再比如買票,用戶通過或者票代售點,代售點從總售票購票,這樣都是代理模式,理解了這個模式的特徵了,那麼接下來的邏輯代碼實現就簡單了,本文中的代碼是以網絡購票流程爲藍版,用戶使用購票軟件購買車票.軟件調用12306的接口進行購票.整個demo的類圖如下圖所示:
接下來就是代碼了:
1.Ticket.java
package com.example.proxyPattern;
/**
* Created by zhangrui on 2018/6/4.
*/
/*
* @ClassName Ticket
*@Description TODO 創建票務接口,提供屬性buy
*@Author zhangrui
*@Date 10:40 10:40
*@Version
* */
public interface Ticket {
int buy();
}
2.ShouPiaoChuangKou.java
package com.example.proxyPattern;
/**
* Created by zhangrui on 2018/6/4.
*/
/*
* @ClassName ShouPiaoChuangKou
*@Description TODO 創建售票窗口類,實現了票的接口,意味着可以買票
*@Author zhangrui
*@Date 10:43 10:43
*@Version
* */
public class ShouPiaoChuangKou implements Ticket {
private String channalName;
public ShouPiaoChuangKou(String channalName){
this.channalName = channalName;
//定義自身具有的方法,經由這個類可以實現網絡購票
this.buyTicketFromWeb(channalName);
}
@Override
public int buy() {
System.out.println("****票務窗口開始進行出票****");
return 1;
}
public void buyTicketFromWeb(String channalName){
System.out.println("從--"+channalName+"---電子渠道發來了一個購票請求");
}
}
3.WebProxyTicket.java
package com.example.proxyPattern;
/**
* Created by zhangrui on 2018/6/4.
*/
/*
* @ClassName WebProxyTicket
*@Description TODO 網絡購票軟件,也實現票務接口,具有購票資質
*@Author zhangrui
*@Date 10:50 10:50
*@Version
* */
public class WebProxyTicket implements Ticket{
public ShouPiaoChuangKou shouPiaoChuangKou;
public String channelName;
public WebProxyTicket(String channelName){
this.channelName = channelName;
}
@Override
public int buy() {
//售票軟件發送請求到售票處,進行購票
if(channelName.startsWith("web")){
shouPiaoChuangKou = new ShouPiaoChuangKou(channelName);
shouPiaoChuangKou.buy();
return 1;
}else {
channelName = "其他網絡渠道";
return 0;
}
}
}
4.ProxyPatternDemo.java
package com.example.proxyPattern;
/**
* Created by zhangrui on 2018/6/4.
*/
/*
* @ClassName ProxyPatternDemo
*@Description TODO 創建測試類,走代理流程,相當於一個人通過智行軟件進行網絡購票
*@Author zhangrui
*@Date 10:54 10:54
*@Version
* */
public class ProxyPatternDemo {
public static void main(String[] args) {
String[] channelNames = {"web--智行","web--12306","web--支付寶","web--WeChat","real--古城街道火車票代售點"};
int tempNum = 1;
for (String channelName:channelNames){
System.out.println("開始第"+tempNum+"次購票請求:");
Ticket ticket = new WebProxyTicket(channelName);
int flag = ticket.buy();
if(flag == 1){
System.out.println("從--"+channelName+"--渠道買票成功,state=200.");
}else {
System.out.println("從--"+channelName+"--渠道買票失敗,state=500.");
}
tempNum++;
System.out.println("------------------------------------------------------");
}
}
}
代碼中有簡單的代碼註釋,流程也比較簡單,重點是理解了業務邏輯.
運行代碼後,輸出結果如下圖所示:
本節模式demo代碼已上傳到博主的GitHub中,有需要的可以直接下載查看,代碼地址:
https://github.com/zhangruibin/designPattern/tree/master/src/main/java/com/example/proxyPattern
Over!