策略模式
问题
最近买了一本书,叫做《设计模式之禅》,读起来还是很顺畅的,跟着例子敲一遍也没问题,可是偏偏到自己真正做一个小项目的时候,就不知道该怎么用了~
记得在去年寒假的时候,在开发Android程序时,学了一个自定义Toast,然后在BaseActivity中写了一个方法,简化Toast的调用,即原来是这样写的:Toast.makeText("XXXX").show();
,改成了这样:show("XXXX")
。所以我想把所有的Activity中的Toast都替换掉,于是乎想到了用一个程序才帮我做这些重复性的工作。可谁知道这小程序一写就是两个多小时!
处理过程
我直接使用了一个Java类,在main方法里面进行了文件的读取,然后进行字符串的替换,最后输出到新文件。
过程还是很简单的,代码也很容易,就是一个字符串的替换而已。问题是当时读入的中文是乱码,搞了好久,然后正则表达式又不怎么会,又搞了好久......
后来仔细一回想,这样写代码实在是一个差劲的程序猿,没有一点面向对象的思想,下次要改一个方式去替换字符串,岂不是要改很多地方???
刚好看到了这个设计模式,想想这个用策略模式来优化结构还是非常不错的。
策略模式
- 概念
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
-
通用类图
-
实际类图
类图说明
首先定义了一个IStrategy
接口,提供了replace
方法。然后具体的替换策略就是一个个的子类(ToastReplaceStrategy
),在Replacer
类中,我们持有IStrategy
的对象的引用,在客户端创建时需要传进来一个具体的IStrategy
对象,然后调用replace
方法进行字符串的替换。
由于String类型的字符串是不可变的,所以我们必须返回一个新的字符串。简单的代码:
IStrategy接口:
public interface IStrategy {
String replace(String s);
}
实现子类:
public class PlaceToastStrategy implements IStrategy {
@Override
public String replace(String s) {
//处理相关替换逻辑 代码太长久不贴出来了
return s;
}
}
Replacer交互类:
public class Replacer {
IStrategy strategy;
public Replacer(IStrategy strategy){
this.strategy = strategy;
}
public String place(String s){
return strategy.replace(s);
}
}
客户端:
pulic class Client{
public static void main(String[] args) throws IOException {
//省略了从文件读入字符串的过程 保存在s中
Replacer replacer = new Replacer(new PlaceToastStrategy());
s = replacer.place(s);
//然后写入新文件即可
}
}
}
- 优点
策略模式的优点就是更新策略的时候,无需改动现有的代码,只需要增加一个具体的策略类就可以了,然后在客户端进行使用。
所以下次要替换别的字符串时,只需要新增一个替换策略类就可以了。
结语
设计模式这种东西,虽然在设计的时候很少用到,但是当发现类的结构十分不恰当时,便可以考虑使用各种设计模式来优化代码与结构。所以平时还是多了解一下设计模式,到需要用的时候才能有的放矢。
以后在项目中用到了设计模式时,我会以今天这篇文章的形式记录下来,所以一篇文章的时间可能比较久。如果想及时看到这类文章,可以关注我哟~