Le modèle de méthode de modèle est l'un des modèles les plus courants parmi tous les modèles. Il s'agit d'une technologie de base de réutilisation de code basée sur l'héritage et n'a aucune relation. Par conséquent, dans le diagramme de structure de classe du modèle de méthode modèle, il n'y a qu'une relation d'héritage.
AbstractClass : classe abstraite, définit et implémente une méthode modèle. Cette méthode modèle définit le squelette de l'algorithme et les étapes des composants logiques sont reportées aux sous-classes dans les opérations abstraites correspondantes.
ConcreteClass : implémente une ou plusieurs méthodes abstraites définies par la classe parent.
Avantages
L'utilisation de la méthode modèle pour placer le code avec la même logique de traitement dans une classe parent abstraite peut améliorer la réutilisabilité du code.
Mettez différents codes dans différentes sous-classes et ajoutez de nouveaux comportements en étendant les sous-classes pour améliorer l'évolutivité du code.
Écrivez le comportement inchangé dans la classe parent, supprimez le code en double de la sous-classe, fournissez une bonne plateforme de réutilisation du code et respectez le principe d'ouverture et de fermeture.
Inconvénients
À mesure que le nombre de classes augmente, chaque classe abstraite nécessite une sous-classe à implémenter, ce qui entraîne une augmentation du nombre de classes et une augmentation de la complexité. L’augmentation du nombre de classes augmente indirectement la complexité de mise en œuvre du système. La relation d'héritage a ses propres inconvénients. Si la classe parent ajoute une nouvelle méthode abstraite, toutes les sous-classes devront la modifier.
Perspective de classe parent : implémentez la partie inchangée d'un algorithme en une seule fois et laissez la partie variable à l'implémentation de la sous-classe ;
Perspective de sous-classe : dans chaque sous-classe, la partie commune est extraite Sortez et concentrez-le dans une classe parent commune pour éviter la duplication de code ;
Le but du modèle de méthode de modèle est de permettre aux sous-classes d'étendre ou d'implémenter une étape spécifique d'une méthode fixe pour les modèles, il s'agit d'un ensemble d'algorithmes fixes ; , certaines étapes de l'algorithme fixe peuvent être étendues via des sous-classes.
Le modèle de stratégie est une encapsulation d'algorithmes. Il encapsule une série d'algorithmes dans des classes correspondantes, et ces classes implémentent la même interface et peuvent être remplacées les unes par les autres. Il existe un autre modèle
qui se concentre également sur l'encapsulation des algorithmes - le modèle de méthode modèle. En regardant le diagramme de classes, nous pouvons voir que la différence entre le modèle de stratégie et le modèle de méthode modèle réside simplement dans le fait qu'il existe une classe d'encapsulation distincte.
Context, qui est différent de la méthode modèle. La différence entre les modes est que dans le mode méthode modèle, le corps principal de l'algorithme appelant se trouve dans la classe parent abstraite, tandis qu'en mode stratégie, le corps principal de la méthode modèle. L'algorithme appelant est encapsulé dans la classe d'encapsulation Contexte. La stratégie abstraite est généralement une stratégie. Le but des interfaces est uniquement de définir des spécifications et ne contient généralement pas de logique. En fait, il ne s'agit que d'une implémentation générale, mais dans la programmation réelle, comme il y a inévitablement la même logique entre les classes spécifiques d'implémentation de stratégie, afin d'éviter la duplication de code, nous utilisons souvent des classes abstraites pour jouer le rôle de stratégie et les encapsuler. Dans le code public, par conséquent, dans de nombreux scénarios d'application, vous verrez généralement l'ombre du modèle de méthode modèle dans le modèle de stratégie.
Cas de code
@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(); }
Classe de modèle d'implémentation concrète
@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"; } }
Mode usine pour obtenir un modèle
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; } }
Classe de test
public class Test { public static void main(String[] args) { AbstractPayCallbackTemplate aliPay = TemplateFactory.getPayCallbackTemplate("aliPay"); String s = aliPay.asyncCallBack(); System.out.println(s); } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!