模板方法模式,從網站登陸開始提及

如今的互聯網上,想必每一個網站都有登陸功能,拿咱們技術人員常逛的技術網站CSDN掘金博客園等爲例,它們都有登陸功能,並且它們的登陸流程都差很少,若是咱們把這些網站的登陸流程用代碼模擬出來,該怎麼弄呢?java

在模擬流程以前,先來分析這個登陸流程,其實無論哪一個網站,登陸流程都是如下四步:算法

  • 一、跳轉到登陸頁面
  • 二、輸入用戶名和密碼
  • 三、點擊登陸按鈕
  • 四、跳轉到首頁

咱們就照着這個流程來用代碼來模擬網站登陸的過程,咱們以 CSDN掘金爲例。設計模式

模擬 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:抽象類
  • ConcreteClass:具體的實現類

咱們用模板方法模式來從新設計咱們的模擬登陸過程, 咱們按照AbstractClass的規則來實現模擬登陸的模板抽象類LoginTemplateLoginTemplate類的具體設計以下: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類,CsdnJueJin類是咱們的具體實現,這兩個類的具體實現跟上面的邏輯跟咱們最開始設計的差很少,CsdnJueJin類的具體實現以下:網站

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()方法就是用模板方法來排序的,有興趣的能夠去深刻了解一下。

最後

打個小廣告,歡迎掃碼關注微信公衆號:「平頭哥的技術博文」,一塊兒進步吧。

平頭哥的技術博文
相關文章
相關標籤/搜索