策略?听起来很有智慧,其实,只是名字唬人而已。策略,通俗的说就是针对某个问题,大家出谋划策,以不同的方式达到解决问题的效果。打个比方,现在是春节,大家吃喝玩乐不亦乐乎,那就说吃饭吧,有时我们细嚼慢咽,而有时就狼吞虎咽,不同的环境下,我们的吃饭方式是不一样的,这就是所谓的策略。
定义:策略模式定义了一组针对某个行为的不同算法实现,并将这些算法封装起来,这些算法都是可以相互替换的,对于客户来说,这些算法的变化都是独立的。
UML图:
从途中可以看出,吃货作为客户,拥有Eatable接口应用,所以可以通过赋值不同的Eatable实现,实现策略模式
例子:
/** * * @author 梅东 * 算法接口 */ public interface Eatable { public void eat(); } /** * 封装算法的实现A * * @author 梅东 */ public class EatableImplA implements Eatable { @Override public void eat() { System.out.println("我狼吞虎咽"); } } /** * 封装算法的实现B * * @author 梅东 */ public class EatableImplB implements Eatable { @Override public void eat() { System.out.println("我细嚼慢咽"); } } /** * 客户 * @author 梅东 * */ public class Client { private Eatable eatable; public void setEatable(Eatable eatable) { this.eatable = eatable; } public void eat() { eatable.eat(); } public static void main(String[] args) { Client client = new Client(); client.setEatable(new EatableImplA()); client.eat(); System.out.println("改变吃的策略================"); //改变吃的策略 client.setEatable(new EatableImplB()); client.eat(); } } 运行结果: 我狼吞虎咽 改变吃的策略================ 我细嚼慢咽
至此,我们已经实现了一个简单的策略模式的例子,通过Eatable接口,解耦了客户和具体实现类,记住,解耦是设计模式中很重要的原则之一。
可能有人会问,为什么客户不实现Eatable接口?毕竟客户具有eat行为啊!对,但是如果使用实现接口的做法,我们就无法动态改变eat行为了,这里又引入了一条重要原则,多用组合,少用继承或实现。我们通过组合完美的达到了继承所能达到的效果,还避免了继承所带来的缺陷。
现在你应该可以感叹,策略模式原来如此啊!很简单,策略模式的应用场景我就不多说了,有兴趣的朋友可以查阅资料。