J'ai utilisé une énumération pour éliminer l'instruction if-else dans l'article précédent. Si vous êtes intéressé, vous pouvez lire cet article:
"Comment utiliser l'énumération pour éliminer if / else? - Utilisation avancée d'énumération
"
Cette fois, j'ai utilisé d'autres méthodes pour éliminer if-else.
Contexte
Vous devez utiliser des instructions if-else dans votre développement habituel. Cependant, un grand nombre d'instructions if-else ne sont pas propices à la lecture de code et affectent la complexité du code. Quoi qu'il en soit, j'ai eu mal à la tête en supprimant l'odeur de Sonar.
Il y avait trop de problèmes if-else dans le code de l'ancien système de l'entreprise, ce qui rendait le code inélégant. Pour expliquer ici, je simplifie la logique métier.
Supposons que je dispose d'une méthode pour calculer le prix réel, qui nécessite la saisie du niveau de l'utilisateur et du prix réel du produit, et renvoie le prix réel du produit. Le code est le suivant:
Voici level
le niveau de l'utilisateur, qui originalPrice
est le prix d'origine du produit. Si le niveau utilisateur est "normal", le prix réel retourné est le prix d'origine multiplié par 1,0. Si le niveau d'utilisateur est "vip", le prix réel retourné est le prix d'origine multiplié par 0,9. Sinon, le prix d'origine est retourné.
En conséquence, le prix du "vip" est:
getActualPrice()测试的真实价格为:90.0
Le code ci-dessus peut sembler correct, mais le niveau de l'utilisateur peut également avoir super vip (svip) ou ssvip. Il peut y en avoir plus, alors cette méthode if-else sera très nombreuse. Et va souvent modifier cette méthode, qui viole le principe d'ouverture et de fermeture dans le principe de conception. Pour cette raison, je me demande si je peux réaliser une level
expansion de niveau sans modifier cette méthode .
Utilisez des modèles de conception pour éliminer if-else
Après de longues délibérations, j'ai décidé d'utiliser des modèles de conception pour éliminer if-else.
CalculerStratégie
public interface CalculateStrategy {
String userLevel();
BigDecimal discount(BigDecimal originalPrice);
}
Ici, écrivez d'abord une interface de calcul, qui définit deux méthodes: l'obtention du niveau utilisateur et la méthode de calcul de prix correspondante.
NormalStratégie
@Component
public class NormalStrategy implements CalculateStrategy {
@Override
public String userLevel() {
return "normal";
}
@Override
public BigDecimal discount(BigDecimal originalPrice) {
return originalPrice.multiply(new BigDecimal("1.0"));
}
}
Classe d'implémentation de niveau normal.
@Component
public class VipStrategy implements CalculateStrategy {
@Override
public String userLevel() {
return "vip";
}
@Override
public BigDecimal discount(BigDecimal originalPrice) {
return originalPrice.multiply(new BigDecimal("0.9"));
}
}
Classe d'implémentation au niveau vip.
Notre code pour calculer le prix réel est le suivant:
Ici, j'ai créé une carte, la clé de la carte stocke le niveau utilisateur level
et la valeur stocke CalculateStrategy
l'objet. Lorsque le système démarre, le conteneur IoC SaleService
crée des objets, puis la carte stocke tous les CalculateStrategy
objets implémentés .
Ensuite, écrivez une getActualPriceWithStrategy()
méthode pour calculer le prix réel du produit en fonction du niveau de l'utilisateur. Si l'utilisateur augmente le niveau, que vous devez ajouter la classe appropriée, telle que: SvipStrategy
, SSvipStrategy
et autres. De cette manière, il n'est pas nécessaire de modifier getActualPriceWithStrategy()
le contenu et la sécurité de cette méthode est garantie.
Le code de test est le suivant:
Résultats de test:
getActualPriceWithStrategy()测试的真实价格为:90.0
En fait, j'ai utilisé le modèle de stratégie dans le modèle de conception ci-dessus. J'ai extrait l'algorithme dans if-else et l'ai encapsulé séparément dans une classe, de sorte que l'algorithme soit indépendant de l'appelant. Si vous modifiez l'algorithme, il vous suffit de changer la classe de l'algorithme, sans changer Votre interlocuteur.
Bien sûr, if-else ne peut pas être éliminé simplement en utilisant le mode stratégie, vous pouvez y penser:
"Y a-t-il d'autres modèles de conception utilisés dans le code ci-dessus?
"
Recommandé dans le passé
-
Avez-vous peur des fuites de mémoire lors de l'utilisation de ThreadLocal?
-
Résumé de l'entretien back-end Java de 30000 mots (avec PDF)
Scannez le code QR pour devenir plus excitant. Ou recherchez Lvshen_9 sur WeChat , vous pouvez répondre pour obtenir des informations
1.回复"java" 获取java电子书;
2.回复"python"获取python电子书;
3.回复"算法"获取算法电子书;
4.回复"大数据"获取大数据电子书;
5.回复"spring"获取SpringBoot的学习视频。
6.回复"面试"获取一线大厂面试资料
7.回复"进阶之路"获取Java进阶之路的思维导图
8.回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)
9.回复"总结"获取Java后端面试经验总结PDF版
10.回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)
11.回复"并发导图"获取Java并发编程思维导图(xmind终极版)
Autre: cliquez sur [ Mes avantages ] pour avoir plus de surprises.