Heim  >  Artikel  >  Java  >  Beispielanalyse einer Java-Designmuster-Vorlagenmethode

Beispielanalyse einer Java-Designmuster-Vorlagenmethode

WBOY
WBOYnach vorne
2023-05-14 14:43:061179Durchsuche

Konzept

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.

Kerndesignpunkte

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.

Vor- und Nachteile

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.

Anwendungsszenario

  • 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;

    # 🎜🎜#
Der Zweck des Vorlagenmethodenmusters besteht darin, Unterklassen die Erweiterung oder spezifische Implementierung eines bestimmten Schritts einer festen Methode für Vorlagen zu ermöglichen. Dabei handelt es sich um eine Reihe fester Algorithmen, die durch bestimmte Unterklassen implementiert werden können Algorithmusschritte im festen Algorithmus.

Der Unterschied zwischen Vorlagenmethode und Strategiemuster

Das Strategiemuster ist eine Kapselung von Algorithmen. Es kapselt eine Reihe von Algorithmen in entsprechende Klassen, und diese Klassen implementieren dieselben Schnittstellen sind untereinander austauschbar. Es gibt ein weiteres Muster

, das sich ebenfalls auf die Kapselung des Algorithmus konzentriert – das Vorlagenmethodenmuster. Wenn Sie das Klassendiagramm vergleichen, können Sie erkennen, dass der Unterschied zwischen dem Strategiemuster und dem Vorlagenmethodenmuster nur in der Addition besteht einer separaten Kapselungsklasse#🎜 🎜#

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 Case

Template 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();
}

Concrete Implementation Template Class

@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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen