摘要:策略模式的使用场景针对同一类型问题的多种处理方式,仅仅是具体行为有差别时需要安全地封装多种同一类型的操作时出现同一抽象类有多个子类,而又需要使用或者来选择具体子类时。抽象策略角色这是一个抽象角色,通常由一个接口或抽象类实现。
写代码时总会出很多的if…else,或者case。如果在一个条件语句中又包含了多个条件语句就会使得代码变得臃肿,维护的成本也会加大,而策略模式就能较好的解决这个问题,本篇博客就带你详细了解策略模式。
策略模式的定义和使用场景1、定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。
分析下定义,策略模式定义和封装了一系列的算法,它们是可以相互替换的,也就是说它们具有共性,而它们的共性就体现在策略接口的行为上,另外为了达到最后一句话的目的,也就是说让算法独立于使用它的客户而独立变化,我们需要让客户端依赖于策略接口。
2、策略模式的使用场景:
1.针对同一类型问题的多种处理方式,仅仅是具体行为有差别时;
2.需要安全地封装多种同一类型的操作时;
3.出现同一抽象类有多个子类,而又需要使用 if-else 或者 switch-case 来选择具体子类时。
这个模式涉及到三个角色:
环境(Context)角色:持有一个Strategy的引用。
抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
策略模式的典型代码如下:
抽象策略类
public interface Strategy { /** * 策略方法 */ public void strategyInterface(); }
具体策略类
public class ConcreteStrategyA implements Strategy { @Override public void strategyInterface() { //相关的业务 } } public class ConcreteStrategyB implements Strategy { @Override public void strategyInterface() { //相关的业务 } }
环境策略类
public class Context { //持有一个具体策略的对象 private Strategy strategy; /** * 构造函数,传入一个具体策略对象 * @param strategy 具体策略对象 */ public Context(Strategy strategy){ this.strategy = strategy; } /** * 策略方法 */ public void contextInterface(){ strategy.strategyInterface(); } }
实例:
假设鹅厂推出了3种会员,分别为会员,超级会员以及金牌会员,还有就是普通玩家,针对不同类别的玩家,购买《王者农药》皮肤有不同的打折方式,并且一个顾客每消费10000就增加一个级别,那么我们就可以使用策略模式,因为策略模式描述的就是算法的不同,这里我们举例就采用最简单的,以上四种玩家分别采用原价(普通玩家),九折,八折和七价的收钱方式。
那么我们首先要有一个计算价格的策略接口:
public interface CalPrice { //根据原价返回一个最终的价格 Double calPrice(Double orgnicPrice); }
下面是4种玩家的计算方式的实现:
public class Orgnic implements CalPrice { @Override public Double calPrice(Double orgnicPrice) { return orgnicPrice; } } public class Vip implements CalPrice { @Override public Double calPrice(Double orgnicPrice) { return orgnicPrice * 0.9; } } public class SuperVip implements CalPrice { @Override public Double calPrice(Double orgnicPrice) { return orgnicPrice * 0.8; } } public class GoldVip implements CalPrice { @Override public Double calPrice(Double orgnicPrice) { return orgnicPrice * 0.7; } }
我们看客户类,我们需要客户类帮我们完成玩家升级的功能:
public class Player { private Double totalAmount = 0D;//客户在鹅厂消费的总额 private Double amount = 0D;//客户单次消费金额 private CalPrice calPrice = new Orgnic();//每个客户都有一个计算价格的策略,初始都是普通计算,即原价 //客户购买皮肤,就会增加它的总额 public void buy(Double amount) { this.amount = amount; totalAmount += amount; if (totalAmount > 30000) {//30000则改为金牌会员计算方式 calPrice = new GoldVip(); } else if (totalAmount > 20000) {//类似 calPrice = new SuperVip(); } else if (totalAmount > 10000) {//类似 calPrice = new Vip(); } } //计算客户最终要付的钱 public Double calLastAmount() { return calPrice.calPrice(amount); } }
接下来是客户端调用,系统会帮我们自动调整收费策略:
public class Client { public static void main(String[] args) { Player player = new Player(); player.buy(5000D); System.out.println("玩家需要付钱:" + player.calLastAmount()); player.buy(12000D); System.out.println("玩家需要付钱:" + player.calLastAmount()); player.buy(12000D); System.out.println("玩家需要付钱:" + player.calLastAmount()); player.buy(12000D); System.out.println("玩家需要付钱:" + player.calLastAmount()); } }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/69152.html
摘要:设计模式的分类经典应用框架中常见的设计模式分为三类创建型模式对类的实例化过程的抽象。对象的结构模式是动态的。对象的行为模式则使用对象的聚合来分配行为。设计模式是个好东西,以后肯定还要进一步的学习,并且在项目中多实践,提升自己的设计能力。 什么是设计模式? Christopher Alexander 说过:每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样...
摘要:常用设计模式大型单页应用里,复杂度上升到一定程度时,没有适当的设计模式进行降耦,后续的开发也难以下手。而设计模式正是为了降耦而存在。特点满足单一职责原则使用代理模式,不在构造函数中判断是否已经创建过该单例满足惰性原则应用弹出登陆窗口。 JS常用设计模式 大型单页应用里,复杂度上升到一定程度时,没有适当的设计模式进行降耦,后续的开发也难以下手。而设计模式正是为了降耦而存在。 单例模式 单...
摘要:在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。换言之,策略模式只适用于客户端知道算法或行为的情况。策略模式概览图参考菜鸟教程策略模式十种常用的设计模式大部分自己总结,部分摘抄与模式之策略模式 策略模式 我们都知道商场打折的时候,会根据会员的等级情况进行不同的折扣优惠,如果是VIP会员,那么可能就是5折优惠,如果是一般会员就是8折优惠,如果是普通顾客就是9折...
摘要:前言设计模式几十种,阅读了设计模式与开发实践这本书后,个人感觉就是围绕对象来设计的,发现日常写代码能用上的并不多,下面是常用的几种设计模式。前端服务端可以参考我的另一个仓库地址,一个简单的实时聊天参考来自设计模式与开发实践读书笔记 前言 设计模式几十种,阅读了《JavaScript设计模式与开发实践》这本书后,个人感觉js就是围绕对象来设计的,发现日常写代码能用上的并不多,下面是常用的...
阅读 2124·2023-04-26 02:19
阅读 1915·2021-11-19 09:40
阅读 1705·2021-09-29 09:35
阅读 3576·2021-09-29 09:34
阅读 4299·2021-09-07 10:16
阅读 5537·2021-08-11 11:14
阅读 3580·2019-08-30 15:54
阅读 1632·2019-08-30 15:53