策略?听起来很有智慧,其实,只是名字唬人而已。策略,通俗的说就是针对某个问题,大家出谋划策,以不同的方式达到解决问题的效果。打个比方,现在是春节,大家吃喝玩乐不亦乐乎,那就说吃饭吧,有时我们细嚼慢咽,而有时就狼吞虎咽,不同的环境下,我们的吃饭方式是不一样的,这就是所谓的策略。
定义:策略模式定义了一组针对某个行为的不同算法实现,并将这些算法封装起来,这些算法都是可以相互替换的,对于客户来说,这些算法的变化都是独立的。
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行为了,这里又引入了一条重要原则,多用组合,少用继承或实现。我们通过组合完美的达到了继承所能达到的效果,还避免了继承所带来的缺陷。
现在你应该可以感叹,策略模式原来如此啊!很简单,策略模式的应用场景我就不多说了,有兴趣的朋友可以查阅资料。