个人理解:策略模式是将不同算法(策略)进行封装,分类,使主体可以动态改变策略,达到不同效果.
优点:在程序运行时,执行同一方法,可以通过这种模式得到不同的执行结果.
用到的设计原则:
1.多用组合,少用继承.因为继承有局限性只能单继承,并且组合更加的灵活,一个类的某个算法是组合来的,而不是继承来的.这也是实现同方法执行不同策略的关键,策略模式的关键.
2.针对接口编程,而不是针对实现.因为针对接口编程可以利用多态的性质.
3.将程序中可能产生变化的部分独立,与不需变化的代码分离.
策略模式结构图:
问题:一个嘎嘎叫的鸭子,有一天嗓子受损,变成了吱吱叫.
实现:1.定义两个QuackBehavior接口的实现类,一个实现"吱吱叫"的方法quack(),一个实现"嘎嘎叫"的方法quack().
2.创建鸭子类的实现类.调用setQuackBehavior()方法,传参(gagaQuack),使鸭子吱吱叫.
3.当鸭子嗓子受损,再次调用setQuackBehavior()方法传参(zhizhiQuack),使鸭子变成了吱吱叫.
下面完整代码实现:
Duck抽象类:
package hxgr.design.strategy;
public abstract class Duck {
QuackBehavior quackBehavior;
public void quack(){
quackBehavior.quack();
}
public QuackBehavior getQuackBehavior() {
return quackBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
QuackBehavior接口:
package hxgr.design.strategy;
public interface QuackBehavior {
void quack();
}
QuackBehavior接口实现类:
package hxgr.design.strategy;
public class GaGaQuackBehavior implements QuackBehavior {
@Override
public void quack() {
System.out.println("嘎嘎叫....");
}
}
package hxgr.design.strategy;
public class ZhiZhiQuackBehavior implements QuackBehavior {
@Override
public void quack() {
System.out.println("吱吱叫...");
}
}
Duck抽象类的实现类:
package hxgr.design.strategy;
public class DuckA extends Duck {
}
测试类:
package hxgr.design.strategy;
public class Test {
public static void main(String[] args) {
//创建实体鸭A
DuckA duckA = new DuckA();
//赋予鸭A嘎嘎叫的行为
duckA.setQuackBehavior(new ZhiZhiQuackBehavior());
//调用叫的方法
duckA.quack();//输出:嘎嘎叫
//当鸭A嗓子受损,声音改变
System.out.println("---------duckA嗓子受损了-------------");
duckA.setQuackBehavior(new GaGaQuackBehavior());
//再调用叫的相同方法
duckA.quack();//输出:吱吱叫
}
}
输出结果: