策略模式其实是为了解决,针对同一个问题有多个不能的解决方式,也就是说提供了多种不同的解决策略。比如,我们对一个数组进行排序。那么这里就有冒泡排序、快速排序、归并排序等等不同的算法,这里我们就可以说这些是不同的策略。可以把这些不同的排序算法设计成策略模式。
本文链接:http://blog.csdn.net/lemon_tree12138/article/details/45894511 -- Coding-Naga
--转载请注明出处
如果我们没有策略模式的话,当我们想要使用不同算法来解决同一个问题的时候,势必要去创建不同的算法对象。然后再对各个不同的对象进行处理。这样来做,当然OK。不过我们还是最好使用本文的策略模式来封装。
关于策略模式的类图,可以下面的图-1.
图-1 策略模式类图
看到策略模式的类图,我们知道不同的策略都是实现了同一个接口,然后再重写接口中的方法。现在,我们已经有了类图。
上面说到策略模式是针对解决同一个问题的不同解法而设计的。那么,我们现在就举个栗子来看看。
现在假设,我们要做一件事:格式化一个时间点。给你一个用秒数表示的时间,现在要用不同的展示方式显示格式化后的表示。实现的类图可以参考上面的图-1。
根据类图,我们首先要有一个接口,并提供一个格式化时间的方法。
public interface FormatTime { public String format(long millis); }
public class FormatWithChinese implements FormatTime { @Override public String format(long millis) { int s = (int) (millis / 1000); int h = s / (60 * 60); s = s % (60 * 60); int m = s / 60; s = s % 60; return StringUtils.formatIntegerString(h, "#00") + "时" + StringUtils.formatIntegerString(m, "#00") + "分" + StringUtils.formatIntegerString(s, "#00") + "秒"; } }
public class StrategyContains { private FormatTime formatTime; public StrategyContains(FormatTime _formatTime) { this.formatTime = _formatTime; } public String format(long millis) { return formatTime.format(millis); } }
public class FormatTimeClient { public static void main(String[] args) { StrategyContains strategy = new StrategyContains(new FormatWithColon()); System.out.println(strategy.format(155796986)); } }
https://github.com/William-Hai/DesignPattern-Strategy