-
模板方法模式
-
很常用,其目的是在一個方法中定義一個算法骨架,而將一些步驟延遲到子類中。
-
模板方法使得子類可以在不改變算法結構的情況下,重新定義算法的某些步驟。
-
在標準的模板方法模式實現中,主要是使用繼承的方式,來讓父類在運行期間可以調用到子類的方法,實際也是多態的體現,如抽象類的內容
-
此外引入回調方法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);
}
}