Das Vorlagenmethodenmuster ist eines der häufigsten Muster unter allen Mustern. Es handelt sich um eine grundlegende Technologie der Code-Wiederverwendung, die auf Vererbung basiert und keine Korrelation aufweist. Daher gibt es im Klassenstrukturdiagramm des Vorlagenmethodenmusters nur eine Vererbungsbeziehung.
AbstractClass: Abstrakte Klasse, definiert und implementiert eine Vorlagenmethode. Diese Vorlagenmethode definiert das Grundgerüst des Algorithmus und die logischen Kompositionsschritte werden in den entsprechenden abstrakten Operationen auf Unterklassen verschoben.
ConcreteClass: Implementiert eine oder mehrere abstrakte Methoden, die von der übergeordneten Klasse definiert werden.
Vorteile
Verwenden Sie die Vorlagenmethode, um den Code mit derselben Verarbeitungslogik einzufügen die abstrakte übergeordnete Klasse, die die Wiederverwendbarkeit von Code verbessern kann.
Fügen Sie verschiedene Codes in verschiedene Unterklassen ein und fügen Sie neue Verhaltensweisen hinzu, indem Sie die Unterklassen erweitern, um die Skalierbarkeit des Codes zu verbessern.
Schreiben Sie das unveränderte Verhalten in die übergeordnete Klasse, entfernen Sie den doppelten Code der Unterklasse und stellen Sie gemäß dem Öffnungs- und Schließprinzip eine gute Plattform zur Wiederverwendung von Code bereit.
Nachteile
Da die Anzahl der Klassen zunimmt, erfordert jede abstrakte Klasse eine Unterklasse zur Implementierung, was zu einer Erhöhung der Anzahl führt Die Komplexität nimmt zu. Die Erhöhung der Anzahl der Klassen erhöht indirekt die Komplexität der Systemimplementierung. Die Vererbungsbeziehung weist ihre eigenen Mängel auf. Wenn die übergeordnete Klasse eine neue abstrakte Methode hinzufügt, müssen alle Unterklassen diese ändern.
Perspektive der übergeordneten Klasse: Implementieren Sie den unveränderten Teil des Algorithmus auf einmal und überlassen Sie den variablen Teil der Unterklasse Implementierung ;
Unterklassenperspektive: In jeder Unterklasse werden die gemeinsamen Teile extrahiert und in einer gemeinsamen übergeordneten Klasse konzentriert, um Codeduplizierung zu vermeiden;
# 🎜🎜#Kontext, der Unterschied zwischen ihm und dem Vorlagenmethodenmuster besteht darin, dass im Vorlagenmethodenmuster der Hauptteil des aufrufenden Algorithmus in der abstrakten übergeordneten Klasse und in der Strategie liegt Muster, der Hauptteil des aufrufenden Algorithmus
#🎜 🎜#Der Körper ist in die Kapselungsklasse eingekapselt. Die abstrakte Strategie Strategie dient im Allgemeinen nur der Definition von Spezifikationen und enthält im Allgemeinen keine Logik. Tatsächlich ist dies nur eine allgemeine Implementierung, aber in der tatsächlichen Programmierung verwenden wir häufig abstrakte Klassen, um die Rolle der Strategie zu spielen und sie zu kapseln, da zwischen bestimmten Strategieimplementierungsklassen zwangsläufig dieselbe Logik besteht. Um eine Duplizierung des Codes zu vermeiden, verwenden wir häufig abstrakte Klassen, um die Rolle der Strategie zu spielen Innerhalb des öffentlichen Codes sehen Sie daher in vielen Anwendungsszenarien im Allgemeinen den Schatten des Vorlagenmethodenmusters im Strategiemuster. Code CaseTemplate Method Abstract Class@Slf4j public abstract class AbstractPayCallbackTemplate { /** * 异步回调业务 * * @return */ public String asyncCallBack() { // 1. 支付回调验证参数 Map<String, String> verifySignatureMap = verifySignature(); // 2. 参数验证成功,写入日志中.. payLog(verifySignatureMap); String analysisCode = verifySignatureMap.get("analysisCode"); if (!analysisCode.equals("200")) { return resultFail(); } // 3. 执行回调异步相关逻辑 return asyncService(verifySignatureMap); } /** * 支付回调验证参数 * * @return */ protected abstract Map<String, String> verifySignature(); /** * 使用多线程异步写入日志 * * @param verifySignatureMap */ @Async void payLog(Map<String, String> verifySignatureMap) { log.info(">>>>>>>>>>第二步 写入payLog........"); } /** * 每个子类需要实现 实现业务解析操作 * * @return */ protected abstract String asyncService(Map<String, String> verifySignatureMap); /** * 异步返回结果.. * * @return */ protected abstract String resultSuccess(); /** * 异步返回失败 * * @return */ protected abstract String resultFail(); }
@Log4j2 public class AliPayCallbackTemplate extends AbstractPayCallbackTemplate { @Override protected Map<String, String> verifySignature() { //>>>>假设一下为银联回调报文>>>>>>>>>>>>>>>> log.info(">>>>>第一步 解析支付宝据报文.....verifySignature()"); Map<String, String> verifySignature = new HashMap<>(); verifySignature.put("price", "1399"); verifySignature.put("orderDes", "充值永久会员"); // 支付状态为1表示为成功.... verifySignature.put("aliPayMentStatus", "1"); verifySignature.put("aliPayOrderNumber", "201910101011"); // 解析报文是否成功 200 为成功.. verifySignature.put("analysisCode", "200"); return verifySignature; } @Override protected String asyncService(Map<String, String> verifySignatureMap) { log.info(">>>>>第三步asyncService()verifySignatureMap:{}", verifySignatureMap); String paymentStatus = verifySignatureMap.get("aliPayMentStatus"); if (paymentStatus.equals("1")) { String aliPayOrderNumber = verifySignatureMap.get("aliPayOrderNumber"); log.info(">>>>orderNumber:{aliPayOrderNumber},已经支付成功 修改订单状态为已经支付..."); } return resultSuccess(); } @Override protected String resultSuccess() { return "ok"; } @Override protected String resultFail() { return "fail"; } } @Slf4j public class UnionPayCallbackTemplate extends AbstractPayCallbackTemplate { @Override protected Map<String, String> verifySignature() { //>>>>假设一下为银联回调报文>>>>>>>>>>>>>>>> log.info(">>>>>第一步 解析银联数据报文.....verifySignature()"); Map<String, String> verifySignature = new HashMap<>(); verifySignature.put("price", "1399"); verifySignature.put("orderDes", "充值永久会员"); // 支付状态为1表示为成功.... verifySignature.put("paymentStatus", "1"); verifySignature.put("orderNumber", "201910101011"); // 解析报文是否成功 200 为成功.. verifySignature.put("analysisCode", "200"); return verifySignature; } @Override protected String asyncService(Map<String, String> verifySignatureMap) { log.info(">>>>>第三步asyncService()verifySignatureMap:{}", verifySignatureMap); String paymentStatus = verifySignatureMap.get("paymentStatus"); if (paymentStatus.equals("1")) { String orderNumber = verifySignatureMap.get("orderNumber"); log.info(">>>>orderNumber:{orderNumber},已经支付成功 修改订单状态为已经支付..."); } return resultSuccess(); } @Override protected String resultSuccess() { return "success"; } @Override protected String resultFail() { return "fail"; } }Factory Mode Get Template#🎜 🎜#
public class TemplateFactory { private final static Map<String, AbstractPayCallbackTemplate> templateMap = new ConcurrentHashMap<>(); static { templateMap.put("aliPay", new AliPayCallbackTemplate()); templateMap.put("unionPay", new UnionPayCallbackTemplate()); } public static AbstractPayCallbackTemplate getPayCallbackTemplate(String templateId) { AbstractPayCallbackTemplate payCallbackTemplate = (AbstractPayCallbackTemplate) templateMap.get(templateId); return payCallbackTemplate; } }
testcategory
public class Test { public static void main(String[] args) { AbstractPayCallbackTemplate aliPay = TemplateFactory.getPayCallbackTemplate("aliPay"); String s = aliPay.asyncCallBack(); System.out.println(s); } }
Das obige ist der detaillierte Inhalt vonBeispielanalyse einer Java-Designmuster-Vorlagenmethode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!