策略模式是在给定的输入条件下,实现某个目标的计划或者方案。策略与算法类似;算法是定义好的过程,它能够提供一组输入产生一个输出。而策略是一个计划,它也涉及如何从一组输入到一组输出。在通常情况之下,与算法相比,策略是能够提供更大范围的可选方案。因而,策略通常是代表一组或一簇相互替换的方案。
当计算机程序存在多种策略时,程序代码会比较复杂。当有多个策略可用时,与策略相关的程序逻辑必须选择其中一个策略来执行,这时策略选择的程序代码可能变得很复杂,同时策略的逻辑通常也比较复杂,我们可以使用策略模式来整理这些代码。
策略操作定义策略的输入和输出,而把策略的实现工作留给各个类。这些类以不同的方案来实现同一个操作,它们为用户提供同一个接口,因而这些类可以相互替换。策略模式允许多种策略共存,而代码不会混乱。策略模式也可以实现模式选择逻辑和策略本身相分离。
它的意图在于把可选的策略或方案封装在不同的类中,并在这些类中实现一个共同的操作。
例子相对简单:
假如现在有四种策略可以提供给用户选择,根据用户的不同情况进行选择。当策略计划简单的有时候采用算法方法比较简单,但如果策略很复杂的时候,采用策略来管理我们的代码会相对比较明智。
面对传统的方法,我们很多时候都会采用面向过程式的方法去实现:
有如下策略
/*
*@author junin
*/
public class Stratery {
protected String stratery;
public Stratery(String stratery){
this.stratery = stratery;
}
}
/*
* 策略1
*@author junin
*/
public class Stratery1 extends Stratery {
public Stratery1(String stratery){
super(stratery);
}
}
/*
* 策略2
* @author junin
*/
public class Stratery2 extends Stratery{
public Stratery2(String stratery){
super(stratery);
}
}
/*
* 策略3
* @author junin
*/
public class Stratery3 extends Stratery{
public Stratery3(String stratery){
super(stratery);
}
}
传统的实现方法如下:
public static Stratery get(int cas){
switch (cas) {
case 1:
return new Stratery1("策略1");
case 2:
return new Stratery2("策略2");
case 3:
return new Stratery1("策略3");
default:
return null;
}
}
根据用户的情况返回。
下面仅对上面的代码进行重构,使其成为strategy模式
定义一个共同的接口:
public interface Advisor {
public Stratery getAdvisor();
}
每个策略方案都实现这个接口:
/*
* 策略1
* @author junin
*/
public class Stratery1 extends Stratery implements Advisor{
public Stratery1(String stratery){
super(stratery);
}
public Stratery1 getAdvisor() {
// TODO Auto-generated method stub
return this;
}
public String toString(){
return stratery;
}
}
最后利用接口实现策略调用:
public class New {
public static Advisor getAdvisor(int cas) {
switch (cas) {
case 1:
return new Stratery1("策略1").getAdvisor();
case 2:
return new Stratery2("策略2").getAdvisor();
case 3:
return new Stratery3("策略3").getAdvisor();
default:
return null;
}
}
public static void main(String[] args) {
Advisor a = getAdvisor(1);
System.out.println(a);
}
}
重构的核心思想就是:将一个操作分布在一组相关的类中。
分享到:
相关推荐
在Python中,我们可以创建一个二维布尔数组dp,其中dp[i][j]表示字符串s的前i个字符与模式p的前j个字符是否匹配。 以下是一个基本的Python解题思路: 1. 初始化dp数组:dp[0][0]表示两个字符串都为空的情况,肯定...
**DP83848单路10/100Mb以太网收发器RMII模式详解** 在现代通信技术中,以太网作为局域网的主要标准,广泛应用于各种设备之间数据传输。DP83848是一款由德州仪器(Texas Instruments)设计的高性能单路10/100Mbps...
- 如果模式p的第j个字符不是通配符,那么dp[i][j] = dp[i-1][j-1] && (s[i-1] == p[j-1]),即当前字符必须与模式字符相等。 - 如果模式p的第j个字符是通配符: - 如果是星号(*),dp[i][j]可以是dp[i][j-2](跳过...
- 如果`p[j-2]`是一个正常字符且与`s[i-1]`不相等,`dp[i][j]`取决于`dp[i][j-2]`,因为`'*'`只能让`p[j-2]`不出现。 - 如果`p[j-2]`是一个正常字符且与`s[i-1]`相等,或者`p[j-2]`是`'.'`,存在以下三种情况: -...
为了找到所有与模式串的Levenshtein距离小于等于某个阈值k的子串,我们可以记录每次计算的结果,并在dp[i][j]不超过k时保存对应的i和j。 C语言实现近似串匹配的动态规划算法通常涉及数组操作、字符串处理和循环结构...
在DP的众多应用中,背包问题是一个典型的场景,尤其是对于1D/1D动态规划优化问题,其涉及的优化技巧和理论不仅对ACM竞赛选手至关重要,也为专业领域内的算法工程师提供了深度理解动态规划优化的关键路径。...
状态转移方程为dp[i][j] = max{dp[i-1][j], dp[i-1][j-w[i]] + v[i]},表示在考虑第i个物品时,选择放入或不放入物品的最优价值。 为了求得最优解,我们需要遍历所有物品和所有可能的背包容量,最后dp[items][C]将...
掌握动态规划的关键在于理解状态定义、状态转移方程和优化策略,以及如何将实际问题转化为符合动态规划模式的模型。在实践中,不断练习和分析不同类型的动态规划问题有助于深化对这一算法的理解。
- 动态规划法:定义二维数组 dp[i][j] 表示从 i 到 j 的子串是否为回文串。 - 扩展中心法:从每个字符或两个字符之间出发,向两边扩展找到最长回文串。 **1.6 字符串的全排列** - **题目描述**: 给定字符串 "abc...
状态转移方程`DP[i] = DP[i] || DP[i - v[j]]`表示当前状态是否可以通过增加桶`v[j]`的容量来达成目标。 - 为了优化动态规划,考虑到每个桶至少使用一次,我们可以初始化DP数组时就将第一个桶的容量加入,这样可以...
例如,工厂模式可能用于创建数据库连接对象,单例模式用于确保日志服务在整个应用中只存在一个实例,而策略模式可能用于定义不同的求解策略,根据输入条件选择最合适的算法。 至于提供的压缩文件"shizisanjiao",它...
定义状态dp[i][j]表示用i个数相加得到j的方法数,转移方程为dp[i][j] = ∑dp[i-1][j-k] (k=1...j),最终结果即为dp[n][N]。 --- ### 4\. 把自然数N分解为若干个自然数之积 **问题描述**:给定一个自然数N,将其...
在深入探讨这30个Java学习目标之前,我们需要理解,Java不仅仅是一种编程语言,它还代表了一个完整的生态系统,包括标准库、框架、工具和最佳实践。以下是对给定内容中提到的30个学习目标的详细解析: #### 1. **...
本篇文章将详细讨论两款以太网控制器——ENC28J60和DP83848,以及它们在数据手册中涉及的主要技术特性。 ENC28J60是一款集成的以太网MAC(媒体访问控制器)和PHY(物理层)芯片,由Microchip Technology公司生产。...
通过递推公式dp[i][j] = min(dp[i][k] + dp[k+1][j] + n * n * n)遍历所有可能的分隔点k,最终得到dp[1][n]即为最小乘法次数。 C++作为实验的编程语言,其强大的类型系统和模板功能使得实现动态规划算法更为便捷。...
参赛者可以尝试构建一个动态规划模型,其中动态规划的每一状态dp[i][j]表示长度为i,最大值为j的好序列数量。在构建过程中,需要考虑序列的构造原则,即如何从一个已知的较小状态推导到下一个更大的状态。而求解x在...
2. **消费水平**:调查当地的经济水平,如JDP(国内生产总值)和人均消费能力,以评估市场潜力。 3. **竞争态势**:分析白酒、啤酒及保健酒等行业的竞争格局,了解主要竞品在当地的地位和影响力。 4. **区域形态**:...
2. **动态规划:**通过构建动态规划状态dp[n][i][j],表示长度为n的Rhymescheme,在第i层,前面出现的字母最大是j的情况下有多少种可能的序列。 3. **Bell Number:**虽然题目中未明确介绍Bell Number的概念,但通过...
动态规划通过构建一个二维数组,记录在前i个物品中选取总重量不超过j的物品所能达到的最大价值。 **完全背包问题**:允许每个物品可以无限次放入背包。在这种情况下,动态规划算法会稍微有所调整,通常会关注物品的...
从左到右,从上到下填充dp矩阵,对于每个dp[i][j],我们考虑包括和不包括当前元素的两种情况,取两者中的较大值。同时,为了记录最大子矩阵的边界,我们需要额外保存最大和以及对应的起始位置。 在实际应用中,为了...