Rumah  >  Artikel  >  Java  >  Analisis contoh kaedah templat corak reka bentuk Java

Analisis contoh kaedah templat corak reka bentuk Java

WBOY
WBOYke hadapan
2023-05-14 14:43:061179semak imbas

Konsep

Corak kaedah templat ialah salah satu corak yang paling biasa antara semua corak Ia adalah teknologi asas penggunaan semula kod berdasarkan warisan dan tidak mempunyai kaitan. Oleh itu, dalam rajah struktur kelas corak kaedah templat, hanya terdapat hubungan pewarisan.

Mata reka bentuk teras

AbstractClass: kelas abstrak, mentakrif dan melaksanakan kaedah templat. Kaedah templat ini mentakrifkan rangka algoritma, dan langkah komposisi logik ditangguhkan kepada subkelas dalam operasi abstrak yang sepadan.

ConcreteClass: Melaksanakan satu atau lebih kaedah abstrak yang ditakrifkan oleh kelas induk.

Kebaikan dan Kelemahan

Kelebihan

  • Menggunakan kaedah templat untuk meletakkan kod dengan logik pemprosesan yang sama ke dalam kelas induk abstrak boleh meningkatkan kebolehgunaan semula daripada kod tersebut.

  • Letakkan kod yang berbeza ke dalam subkelas yang berbeza dan tambah gelagat baharu dengan melanjutkan subkelas untuk meningkatkan kebolehskalaan kod.

  • Tulis gelagat yang tidak berubah dalam kelas induk, alih keluar kod pendua subkelas dan sediakan platform penggunaan semula kod yang baik yang mematuhi prinsip pembukaan dan penutup.

Kelemahan

Apabila bilangan kelas bertambah, setiap kelas abstrak memerlukan subkelas untuk dilaksanakan, yang membawa kepada pertambahan bilangan kelas dan peningkatan kerumitan . Peningkatan bilangan kelas secara tidak langsung meningkatkan kerumitan pelaksanaan sistem. Hubungan warisan mempunyai kelemahannya sendiri Jika kelas induk menambah kaedah abstrak baharu, semua subkelas perlu mengubahnya.

Senario aplikasi

  • Perspektif kelas induk: laksanakan bahagian algoritma yang tidak berubah pada satu masa dan biarkan bahagian pembolehubah kepada subkelas untuk pelaksanaan;

  • Perspektif subkelas: Dalam setiap subkelas, bahagian sepunya diekstrak dan ditumpukan ke dalam kelas induk sepunya untuk mengelakkan pertindihan kod;

Corak kaedah templat Tujuannya adalah untuk membenarkan subkelas untuk melanjutkan atau secara khusus melaksanakan langkah khusus kaedah tetap untuk templat, ia adalah satu set algoritma tetap, dan langkah algoritma tertentu dalam algoritma tetap boleh dilanjutkan melalui subkelas.

Perbezaan antara kaedah templat dan corak strategi

Corak strategi ialah enkapsulasi algoritma. Ia merangkumkan satu siri algoritma ke dalam kelas yang sepadan, dan kelas ini melaksanakan antara muka yang sama dan berinteraksi antara satu sama lain. . Terdapat satu lagi corak

yang turut memfokuskan pada merangkum algoritma - corak kaedah templat Dengan membandingkan gambar rajah kelas, anda boleh melihat bahawa perbezaan antara corak strategi dan corak kaedah templat hanyalah terdapat satu. kelas enkapsulasi berasingan

Konteks, perbezaan di antaranya dan corak kaedah templat ialah dalam corak kaedah templat, badan utama algoritma panggilan berada dalam kelas induk abstrak, manakala dalam corak strategi, yang utama badan algoritma panggilan dirangkumkan Apabila ia datang kepada Konteks kelas terkapsul, Strategi strategi abstrak secara amnya adalah antara muka Tujuannya hanya untuk mentakrifkan spesifikasi dan secara amnya tidak mengandungi logik. Sebenarnya, ini hanyalah pelaksanaan umum, tetapi dalam pengaturcaraan sebenar, kerana tidak dapat tidak terdapat beberapa logik yang sama antara kelas pelaksanaan strategi tertentu, untuk mengelakkan pertindihan kod, kami sering menggunakan kelas abstrak untuk memainkan peranan Strategi dan merangkumnya dalam kod Awam, oleh itu, dalam banyak senario aplikasi, anda biasanya akan melihat bayang-bayang corak kaedah templat dalam corak strategi.

Kes kod

Kelas abstrak kaedah templat

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

Kelas templat pelaksanaan konkrit

@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";
    }
}

Templat pemerolehan mod kilang

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

Kelas ujian

rreeee

Atas ialah kandungan terperinci Analisis contoh kaedah templat corak reka bentuk Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam