public abstract class AbstractClass {
/**
* 模板方法定義算法流程
*/
public void template() {
//起牀
operation1();
//洗漱
operation2();
//跑步
operation3();
//早飯
operation4();
//上班
operation5();
}
/**
* 算法中所有子類公工操作
*/
public void operation1() {
System.out.println("起牀");
}
/**
* 算法中所有子類公工操作
*/
public void operation2() {
System.out.println("洗漱");
}
/**
* 算法中默認操作
*/
public void operation3() {
System.out.println("室內跑步");
}
/**
* 算法中子類特定操作
*/
public abstract void operation4();
/**
* 算法中子類公共操作
*/
public void operation5() {
System.out.println("上班");
}
}
2、實現類
public class ConcreteClass extends AbstractClass {
@Override
public void operation4() {
System.out.println("早飯喝粥");
}
}
(2)、實現抽象類,重寫父類方法
public class ConcreteClass2 extends AbstractClass {
@Override
public void operation3() {
System.out.println("室外跑步");
}
@Override
public void operation4() {
System.out.println("早飯吃麪");
}
}
在看看項目中使用到的模板方法模式
public abstract class AbstractConsumer {
/**
* 配置文件
*/
private Map<String, String> properties = Maps.newHashMap();
/**
* 消費對象
*/
DefaultMQPushConsumer consumer = null;
/**
* 配置屬性按照子類配置獲取
*
* @return
*/
abstract Map<String, String> getProperties();
/**
* 具體子類消息處理方法
*
* @param key
* @param messageBody
* @return
*/
abstract Boolean handler(String key, String messageBody);
/**
* 這裏相當於是模板方法
*/
public void listener() {
try {
// 配置屬性獲取
properties = getProperties();
// 對象
consumer = new DefaultMQPushConsumer(properties.get("group"));
// 屬性設置……
consumer.setNamesrvAddr(properties.get("nameServer"));
// 註冊監聽
consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
for (int i = 0; i < msgs.size(); i++) {
MessageExt msgExt = msgs.get(i);
String key = msgExt.getMsgId();
String msgBody = new String(msgExt.getBody());
// 消息處理
handler(key, msgBody);
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
});
consumer.start();
} catch (MQClientException e) {
logger.error("mqProperty:{}", JSON.toJSONString(mqProperty), e);
}
}
}
2、實現類
public class Customer2B extends AbstractConsumer {
@Override
protected Map<String, String> getProperties() {
Map<String, String> param = Maps.newHashMap();
param.put("group", "ToB");
param.put("nameServer", "127.0.0.1:8090");
return param;
}
@Override
Boolean handler(String key, String messageBody) {
//數據入庫B
return true;
}
}
(2)、C端數據消費
public class Customer2C extends AbstractConsumer {
@Override
protected Map<String, String> getProperties() {
Map<String, String> properties = Maps.newHashMap();
properties.put("group", "ToC");
properties.put("nameServer", "127.0.0.1:8090");
return properties;
}
@Override
Boolean handler(String key, String messageBody) {
//數據入庫C
return true;
}
}
四、優點