如今的互聯網上,想必每一個網站都有登陸功能,拿咱們技術人員常逛的技術網站CSDN
、掘金
、博客園
等爲例,它們都有登陸功能,並且它們的登陸流程都差很少,若是咱們把這些網站的登陸流程用代碼模擬出來,該怎麼弄呢?java
在模擬流程以前,先來分析這個登陸流程,其實無論哪一個網站,登陸流程都是如下四步:算法
咱們就照着這個流程來用代碼來模擬網站登陸的過程,咱們以 CSDN
、掘金
爲例。設計模式
/** * 模擬csdn登陸 */
public class CsdnLogin {
// 第一步:獲取登陸頁面
public void getLoginPage(){
System.out.println("跳轉到csdn登陸頁面...");
}
// 第二步:設置用戶名密碼
public void setUserAndPass(){
System.out.println("設置好了csdn的用戶名和密碼...");
}
// 第三步:點擊登陸
public void clickLogin(){
System.out.println("點擊了csdn的登陸按鈕...");
}
// 進入主頁
public void home(){
System.out.println("歡迎來到CSDN社區...");
}
}
複製代碼
/** * 模擬掘金登陸 */
public class JuejinLogin {
// 第一步:獲取登陸頁面
public void getLoginPage(){
System.out.println("跳轉到掘金登陸頁面...");
}
// 第二步:設置用戶名密碼
public void setUserAndPass(){
System.out.println("設置好了掘金的用戶名和密碼...");
}
// 第三步:點擊登陸
public void clickLogin(){
System.out.println("點擊了掘金的登陸按鈕...");
}
// 進入主頁
public void home(){
System.out.println("歡迎來到掘金社區...");
}
}
複製代碼
public class Test {
public static void main(String[] args) {
System.out.println("--------模擬登陸到csdn--------");
System.out.println("");
CsdnLogin csdn = new CsdnLogin();
csdn.getLoginPage();
csdn.setUserAndPass();
csdn.clickLogin();
csdn.home();
System.out.println("");
System.out.println("--------模擬登陸到掘金--------");
System.out.println("");
JuejinLogin juejin = new JuejinLogin();
juejin.getLoginPage();
juejin.setUserAndPass();
juejin.clickLogin();
juejin.home();
}
}
複製代碼
CSDN
、
掘金
都有本身的控制流程,那若是我一不當心把
juejin.clickLogin();
寫到了
juejin.setUserAndPass();
的前面,那個人登陸豈不是失敗了?仔細想一想,
CSDN
、
掘金
登陸流程都是同樣的,那咱們能不能把這個流程固定到一個方法中,讓它變成一個不可變的標準流程呢?也許這是可行的,咱們使用一種新的設計模式,叫作
模板方法模式。先一塊兒來簡單瞭解一下模板方法模式。
在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類能夠在不改變算法結構的狀況下,從新定義算法中的某些步驟。微信
咱們用模板方法模式來從新設計咱們的模擬登陸過程, 咱們按照AbstractClass
的規則來實現模擬登陸的模板抽象類LoginTemplate
,LoginTemplate
類的具體設計以下:ide
/** * 模板方法模式-抽象類 */
public abstract class LoginTemplate {
abstract void getLoginPage();
abstract void setUserAndPass();
abstract void clickLogin();
abstract void home();
/** * 在模板中定義了一個運行方法 * 這個方法會按照我麼須要的順序去執行 */
public final void login(){
getLoginPage();
setUserAndPass();
clickLogin();
home();
System.out.println("");
}
}
複製代碼
咱們將登陸涉及到的四個方法抽到到這個中,而且定義了一個模板方法login()
,模板方法中的定義好了執行的順序,須要特別注意的地方是模板方法使用了final
修飾,這樣作的目的是防止子類重寫改變執行的順序。測試
ConcreteClass
類是具體的實現,咱們須要定義兩個ConcreteClass
類,Csdn
、JueJin
類是咱們的具體實現,這兩個類的具體實現跟上面的邏輯跟咱們最開始設計的差很少,Csdn
、JueJin
類的具體實現以下:網站
public class Csdn extends LoginTemplate {
@Override
public void getLoginPage() {
System.out.println("跳轉到csdn登陸頁面...");
}
@Override
public void setUserAndPass() {
System.out.println("設置好了csdn的用戶名和密碼...");
}
@Override
public void clickLogin() {
System.out.println("點擊了csdn的登陸按鈕...");
}
@Override
public void home() {
System.out.println("歡迎來到CSDN社區...");
}
}
複製代碼
public class JueJin extends LoginTemplate {
@Override
public void getLoginPage() {
System.out.println("跳轉到掘金登陸頁面...");
}
@Override
public void setUserAndPass() {
System.out.println("設置好了掘金的用戶名和密碼...");
}
@Override
public void clickLogin() {
System.out.println("點擊了掘金的登陸按鈕...");
}
@Override
public void home() {
System.out.println("歡迎來到掘金社區...");
}
}
複製代碼
從新編寫咱們的測試類App
,測試類的具體代碼以下:spa
public class App {
public static void main(String[] args) {
// 模擬csdn登陸
LoginTemplate csdn = new Csdn();
// 調用模板方法
csdn.login();
// 模擬掘金登陸
LoginTemplate juejin = new JueJin();
juejin.login();
}
}
複製代碼
測試結果:設計
使用模板方法模式以後,給咱們模擬登陸帶來了哪些好處?我總結了一下,使用模板方法模式帶來了以下好處:LoginTemplate
類主導一切,它有一個保護login()
方法控制着整個登陸流程clickLogin()
添加一個verify()
方法,而後子類作具體實現就好,保證了這個流程不會出錯。從咱們的網站登陸案例中,能夠看出模板方法模式確實給咱們帶來了很多的好處,一塊兒來總結一下模板方法模式的優缺點吧。3d
最後多少一句,JDK 中的Collections.sort()
方法就是用模板方法來排序的,有興趣的能夠去深刻了解一下。
打個小廣告,歡迎掃碼關注微信公衆號:「平頭哥的技術博文」,一塊兒進步吧。