96SEO 2026-02-20 03:06 0
定义一系列的算法#xff0c;把它们一个个封装起来#xff0c;并且使它们可相互替换。

本模式
Strategy就不以案例开头了直奔主题先来看看什么是策略模式。
定义一系列的算法把它们一个个封装起来并且使它们可相互替换。
本模式
用来约束一系列具体的策略算法。
定义了算法的公共接口使得算法可以互换使用。
具体的算法实现继承自策略接口。
每个具体策略类实现了策略接口中定义的算法
负责和具体的策略类交互。
通常上下文会持有一个真正的策略实现。
上下文可以让具体的策略类来获取上下文的数据。
甚至可以让具体的策略类来回调上下文的方法。
{System.out.println(执行策略A的算法实现);}
{System.out.println(执行策略B的算法实现);}
{System.out.println(执行策略C的算法实现);}
{strategy.algorithmInterface();}
ConcreteStrategyA());context.contextInterface();context.setStrategy(new
ConcreteStrategyB());context.contextInterface();context.setStrategy(new
ConcreteStrategyC());context.contextInterface();}
我们以CRM中的报价场景为例来看一下策略模式的使用简化一下场景会有如下的报价方案
对普通客户或者是新客户报全价对老客户报的价格统一折扣5%对大客户报的价格统一折扣10%。
首先需要定义出算法的接口。
然后把各种报价的计算方式单独出来形成算法类。
对于Price类把它当做上下文在计算报价的时候不再需要判断直接使
用持有的具体算法进行运算即可。
具体选择使用哪一个算法的功能挪出去放到外部使
strategy.calcPrice(goodsPrice);}
ClientType{//正常客户normal,//老客户old,//大客户large;}Service
ClientMapper.findById(clientId);//……客户其他认证逻辑Double
XXMapper.queryNowPrice();result.setPrice(getPriceUtil(client.getClientType()).qute(nowPrice
(Strategy)context.getBean(OldCustomerStrategy.class);break;case
(Strategy)context.getBean(LargeCustomerStrategy.class);break;default:strategy
(Strategy)context.getBean(NormalCustomerStrategy.class);break;}Price
使用该写法虽然相比if-else来讲要更为麻烦但是随着报价场景的增加我们仅仅通过新增实现类和调整getPriceUtil方法即可完成扩展。
策略模式的功能是把具体的算法实现从具体的业务处理中独立出来把它们实现成
策略模式的重心不是如何来实现算法而是如何组织、调用这些算法从而让程序结构更灵活具有更好的维护性和扩展性。
策略模式一个很大的特点就是各个策略算法的平等性。
对于一系列具体的策略算法
大家的地位是完全一样的正是因为这个平等性才能实现算法之间可以相互替换。
所以可以这样描述这一系列策略算法策略算法是相同行为的不同实现。
策略模式很好地体现了开一闭原则。
策略模式通过把一系列可变的算法进行封装并定义出合理的使用结构使得在系统出现新算法的时候能够很容易地把新的算法加入到已有的系统中而已有的实现不需要做任何修改。
这在前面的示例中已经体现出来了好好体会一下。
策略模式还很好地体现了里氏替换原则。
策略模式是一个扁平结构一系列的实现算法其实是兄弟关系都是实现同一个接口或者继承的同一个父类。
这样只要使用策略的客户保持面向抽象类型编程就能够使用不同策略的具体实现对象来配置它从而实现一系列算法可以相互替换。
看了前面的示例很多朋友会发现每个策略算法具体实现的功能就是原来在f-else
没错其实多个if-elseif语句表达的就是一个平等的功能结构你要么执行if要么
执行else或者是elseif这个时候if块中的实现和else块中的实现从运行地位上来讲是平等的。
而策略模式就是把各个平等的具体实现封装到单独的策略实现类了然后通过上下
文来与具体的策略类进行交互。
所以其实很多地方都在讲策略模式能消除遍地if-else是不准确的if-else并没有消失只是代码形式改变了但是使用策略模式替换if-else的优势是不可否认的将原本if-else内的逻辑抽离出来可以达到修改具体内容而不破坏外层框架的目的。
因此多个f-else语句可以考虑使用策略模式。
在前面的示例中Strategy都是使用接口来定义的这也是常见的实现方式。
但是如
果多个算法具有公共功能的话可以把Strategy实现成为抽象类然后把多个算法的公
{System.out.println(这是一个公共方法);}//
{System.out.println(执行策略A的算法实现);}
{System.out.println(执行策略B的算法实现);}
{System.out.println(执行策略C的算法实现);}
在策略模式中通常是上下文Context使用具体的策略实现对象。
反过来策略实现对象也
可以从上下文获取所需要的数据。
因此可以将上下文当作参数传递给策略实现对象这
在这种情况下上下文封装看具体策略对象进行算法运算所需要的数据具体策略
甚至在某些情况下策略实现对象还可以回调上下文的方法来实现一定的功能这种使用场景下上下文变相充当了多个策略算法实现的公共接口。
在上下文定义的方法
但是需要注意由于所有的策略实现对象都实现同一个策略接口传入同一个上
下文可能会造成传入的上下文数据的浪费因为有的算法会使用这些数据
而有的算法不会使用但是上下文和策略对象之间交互的开销是存在的。
很多企业的工资支付方式是很灵活的可支付方式是比较多的比如人民币现金支付、美元现金支付、银行转账到工资账户、银行转账到工资卡一些创业型的企业为了留住骨干员工还可能有工资转股权等方式。
总之一句话工资支付方式很多。
随着公司的发展会不断有新的工资支付方式出现这就要求能方便地扩展另外工资支付方式不是固定的是由公司和员工协商确定的也就是说可能不同的员工采用的是不同的支付方式甚至同一个员工不同时间采用的支付方式也可能会不同这就要求能很方便地切换具体的支付方式。
要实现这样的功能显然策略模式是一个很好的选择。
在实现这个功能的时候不同的策略算法需要的数据是不一样比如现金支付就不需要银行账号而银行转账就需要账号。
这就导致在设计策略接口中的方法时不太好确定参数的个数而且就算现在把所有的参数都列上了扩展性难以保障加入一个新策略就需要修改接口。
我们根据上面对于Context与Strategy的关系分析基于将上下文当作参数传递给策略对象的方式以策略模式实现上述需求。
这里先简单实现人民币现金支付和美元现金支付方式当然并不是真地去实现跟银行的交互只是示意一下
只有getter方法让策略算法在实现的时候根据需要来获取上下文中的数据public
使用客户希望的支付策略来支付工资this.strategy.pay(this);}
strategyDollar);ctx2.payNow();}
基本的策略模式框架已经搭建完成如果接下来需要增加一种支付方式要求能支付到银行基于以上代码扩展方式有两种。
扩展方式一通过扩展上下文对象Context来准备新的算法需要的数据
这个新的算法自己知道要使用扩展的支付上下文所以强制造型一下PaymentContext2
strategyDollar);ctx2.payNow();//
通过代码实现可以看出这种扩展方式是新增加一种支付到银行卡的策略实现然后通过继承来扩展支付上下文其中添加新的支付方式需要的新数据比如银行卡账户并在客户端使便用新的上下文和新的策略实现就可以了这样已有的实现都不需要改变完全遵循开一闭原则。
Card2(010998877656);PaymentContext
优点所有策略的实现风格更统一策略需要的数据都统一从上下文来获取这样在使用方法上也很统一在上下文中添加新的数据别的相应算法也可以用得上可以视为公共的数据。
缺点如果这些数据只有一个特定的算法来使用那么这些数据有些浪费每次添加新的算法都去扩展上下文容易形成复杂的上下文对象层次也未见得有必要。
优点实现起来简单容易理解。
缺点实现风格与其他策略不一致其他策略都是从上下文中来获取数据而这个策略的实现一部分数据来自上下文一部分数据来自自己有些不统一外部使用这些策略算法的时候也不一难于以一个统一的方式来动态切换策略算法。
当出现有许多相关的类仅仅是行为有差别的情况下可以使用策略模式来使用多个行为中的一个来配置一个类的方法实现算法动态切换。
当出现同一个算法有很多不同实现的情况下可以使用策略模式来把这些“不同的实现”实现成为一个算法的类层次。
当需要封装算法中有与算法相关数据的情况下可以使用策略模式来避免暴露这些跟算法相关的数据结构。
当出现抽象一个定义了很多行为的类并且是通过多个f-else语句来选择这些行为的情况下可以使用策略模式来代替这些条件语句。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback