程序功能:字符串处理
interface Processor {
String name();
Object process(Object input);
}
class StringProcessor implements Processor {
public String name() {
return getClass().getSimpleName();
}
public Object process(Object input) {
return input;
}
}
class Upcase extends StringProcessor {
public String process(Object input) {
return ((String) input).toUpperCase();
}
}
class LowerCase extends StringProcessor {
public String process(Object input) {
return ((String) input).toLowerCase();
}
}
class Spliter extends StringProcessor {
public String process(Object input) {
return Arrays.toString(((String) input).split(" "));
}
}
public class Apply {
public static void process(Processor p, Object input) {
System.out.println("使用的策略是 " + p.name());
System.out.println(p.process(input));
}
public static void main(String[] args) {
String s = "sds HGfhj dsfsDF fdgf ssDD";
process(new Upcase(), s);
process(new LowerCase(), s);
process(new Spliter(), s);
}
}
打印出的结果是:
使用的策略是 Upcase
SDS HGFHJ DSFSDF FDGF SSDD
使用的策略是 LowerCase
sds hgfhj dsfsdf fdgf ssdd
使用的策略是 Spliter
[sds, HGfhj, dsfsDF, fdgf, ssDD]
public static void process(Processor p, Object input) {
System.out.println("使用的策略是 " + p.name());
System.out.println(p.process(input));
}
这就是3中不同的策略都用在了处理一种字符串上,如果方法是一段及其复杂的代码段,那么就可以很好的起到重用的效果,开闭原则:扩展开放,更改关闭很好的体现了出来。如果有新的策略,比如让字符串反序输出的策略,源代码完全不用更改,直接扩展新的类就可以了。
策略模式的主要思想还是java的很多基础概念的综合运用,其实就是万变不离其宗,刚开始看Apply中的process方法会有点疑惑,p是接口的引用,根本还未指向任何实际的对象,怎么能调用name()方法和process方法呢,这两个是抽象的啊。
java是一种强类型检查的语言,无时无刻都在检查着你的类项是否正确,在编译阶段,java发现引用p的类型是Processor ,而name()方法和process方法确实是Processor类中为对象所定义的方法,这就够了,这就已经符合了编译器的要求,而在真正的运行期,java的多态和后期绑定就来了,而且帮你自动完成,执行程序的时候,java才会去看,p真正引用的对象是谁,那么就调用这个对象的方法,所以反射机制也能正确的显示出正在被加载的策略的正确的名
称。
这也很好的体现出了面向接口编程,Processor p 就是接口引用,如果它设计好了,你的代码就可以操控它和它的所有实现类了,所以我们的代码要面向接口编程,参数是接口化的,而不是对着接口的某300种实现在写程序,只要对着接口引用写就行了,后面的多态和后期绑定,java会自己帮我们完成的。
分享到:
相关推荐
对于动态规划,可以定义一个二维布尔数组`dp`,其中`dp[i][j]`表示目标字符串的前`i`个字符和模式字符串的前`j`个字符是否匹配。然后根据通配符的规则填充这个数组。对于回溯搜索,我们可以使用递归函数,每次递归都...
#### 一、字符串处理技术 **1.1 旋转字符串** - **题目描述**: 给定一个字符串,如 "abcdef",要求把字符串前面的若干个字符移动到字符串的尾部,例如将 "a" 和 "b" 移动到尾部,使得原字符串变成 "cdefab"。要求...
初始化时,dp[0][j]等于模式串中需要插入j个字符到空字符串的次数,即j;dp[i][0]等于目标串中需要删除i个字符的次数,即i。接下来,我们可以通过以下状态转移方程来填充dp数组: ```c if (s1[i-1] == s2[j-1]) { /...
- 如果模式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](跳过...
在Python中,我们可以创建一个二维布尔数组dp,其中dp[i][j]表示字符串s的前i个字符与模式p的前j个字符是否匹配。 以下是一个基本的Python解题思路: 1. 初始化dp数组:dp[0][0]表示两个字符串都为空的情况,肯定...
"Regular Expression Matching"(正则表达式匹配)是另一个涉及字符串处理的复杂问题,它要求编写一个函数来判断一个字符串是否符合给定的正则表达式模式。 在标签中提到的"系统开源"可能意味着这个压缩包中的代码...
动态规划方法的核心在于构建一个二维布尔数组`dp`,其中`dp[i][j]`表示字符串`s`的前`i`个字符能否与正则表达式`p`的前`j`个字符匹配。首先,初始化`dp`数组全为`false`,然后设定边界条件:当`s`和`p`都为空时,`dp...
计算两个字符串之间通过插入、删除、替换操作的最小步数,可以使用动态规划求解,递归公式为`dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1] + cost)`,其中`cost`表示当前字符是否相同。 **系统设计**: -...
2. **AC自动机**(如poj3278, poj1426, poj3126, poj3087, poj3414):多模式字符串匹配算法,用于同时匹配多个模式字符串,适用于病毒扫描、关键词过滤等场景。 3. **状态压缩DP**(如poj2531, poj1416, poj2676, ...
在处理字符串时,我们经常使用遍历、子串查找、模式匹配等技术。例如,我们可以使用滑动窗口或双指针法来寻找两个目标单词在文本中的位置。 动态规划是一种强大的算法设计策略,尤其适用于解决具有重叠子问题和最...
1. 状态定义:确定动态规划状态,例如dp[i][j]表示模式串的前i个字符与目标串的前j个字符是否匹配。 2. 状态转移方程:建立状态之间的转移规则,考虑如何从已知子问题的结果推导出当前问题的解。 3. 边界条件:初始...
该题目考查了字符串处理中的模式匹配技术。 **解题思路:** 1. **模式匹配:**对于给定的母串S和模板串,需要设计一种方法来快速判断两者是否匹配,即它们的首字母和尾字母相同,而中间的字母序列可以任意排列。 2....
对于完全背包问题,物品可以无限次使用,如单词拆分问题,单词就是物品,字符串是背包。动态规划可以通过遍历所有可能的物品选择来找到最优解。 再来看看买卖股票问题。动态规划可以用来解决至少买卖一次或两次的...