Java設計模式之模板方法組合模式以及回調方法簡述

  • 模板方法模式

  • 很常用,其目的是在一個方法中定義一個算法骨架,而將一些步驟延遲到子類中。

  • 模板方法使得子類可以在不改變算法結構的情況下,重新定義算法的某些步驟。

  • 在標準的模板方法模式實現中,主要是使用繼承的方式,來讓父類在運行期間可以調用到子類的方法,實際也是多態的體現,如抽象類的內容

  • 此外引入回調方法CallBack:回調技術。回調是一種雙向的調用模式,也就是說,被調用的接口被調用時也會調用對方的接口,

  • 簡單點說明就是:A類中調用B類中的C方法,然後B類中的C方法中反過來調用A類中的D方法,那麼D這個方法就叫回調方法。

package com.it.designpatterns;

/**
 * @author TonyJoba
 * 模板方法模式
 * 很常用,其目的是在一個方法中定義一個算法骨架,而將一些步驟延遲到子類中。
 * 模板方法使得子類可以在不改變算法結構的情況下,重新定義算法的某些步驟。
 * 在標準的模板方法模式實現中,主要是使用繼承的方式,來讓父類在運行期間可以調用到子類的方法,實際也是多態的體現,如抽象類的內容
 *
 * 此外引入回調方法CallBack:回調技術。回調是一種雙向的調用模式,也就是說,被調用的接口被調用時也會調用對方的接口,
 *               簡單點說明就是:A類中調用B類中的C方法,然後B類中的C方法中反過來調用A類中的D方法,那麼D這個方法就叫回調方法。
 */
public class TemplateMethodPattern {
    public static void main(String[] args) {

        //templateMethodPattern
        ChildOne childOne = new ChildOne();
        TemplateMethod.algorithSkeleton(childOne);
        ChildTwo childTwo = new ChildTwo();
        TemplateMethod.algorithSkeleton(childTwo);

        //callback方法
        //A 需要向 B 發送請求,先通過實例化的形式,建立AB間的鏈接
        A a = new A(new B());
        a.request("ping");

    }
}

class TemplateMethod{

    /**
     * 算法骨架作爲模板,通過傳入不同的類嵌入模板,實現不同的邏輯
     */
    public static void algorithSkeleton(IMyInterface iMyInterface){
        System.out.println("進入算法骨架");
        System.out.println("進行通用的處理,如彈開一個空白框");

        System.out.print("進行嵌入模板(算法骨架)的方法調用");
        iMyInterface.doAction();

        System.out.println("進行通用性的後置處理");
        System.out.println();
    }

}


/**
 * 這裏通過接口的形式來代替抽象,當然也可以使用抽象類,目的都是讓實現類實現抽象方法
 */
interface IMyInterface {
    public abstract void doAction();
}

class ChildOne implements IMyInterface{

    @Override
    public void doAction() {
        System.out.println("use childOne method");
    }
}

class ChildTwo implements IMyInterface{

    @Override
    public void doAction() {
        System.out.println("use childTwo method");
    }
}








interface CallBack{
    /**
     * 響應的信息
     * @param response
     */
    public void response(String response);
}

/**
 * 請求端
 */
class A implements CallBack{
    /**
     * B是A的交互類
     */
    private B b;

    public A(B b){
        this.b = b;
    }

    /**
     * A 向 B 發送請求
     * @param request
     */
    public void request(String request){
        //執行請求,爲了回調,需要在B中定義請求的執行
        b.excute(A.this,request);
    }

    /**
     * 響應的信息
     *
     * @param response
     */
    @Override
    public void response(String response) {
        System.out.println("A 得到 B 響應"+response);
    }



}

/**
 * 服務端
 */
class B {

    /**
     * B 對 A 發來的進行接收執行
     * 並用A的接受方式進行反饋
     * @param callBack
     * @param request
     */
    public void excute(CallBack callBack,String request){
        System.out.println("接收到 A 發來的請求 "+request);
        //考慮執行
        try {
            System.out.println("響應中。。。");
            //模擬10s的響應時間
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //得到結果,進行信息反饋
        String response = " 響應成功 !";
        callBack.response(response);
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章