HeadFirst中策略模式的定义:策略模式定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
策略模式体现的设计原则:1.封装变化,把会变化的部分封装起来,让其他部分不受到影响。使代码更加有弹性。
2.面向接口编程,而不是面向实现编程。更易于维护和扩展,更有条理。
策略模式的典型应用:CRM的报价策略,GUI编程中布局管理器的底层架构等等。
自己写的一个Demo(注释比较直接):
package com.wxisme.strategy;
/**
* 策略接口,用来统一策略的具体实现
* @author wxisme
*
*/
public interface Strategy {
public void action();
}
package com.wxisme.strategy;
/**
* 策略的上下文交互,用来封装策略。
* @author wxisme
*
*/
public class Context {
Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void executeAction() {
this.strategy.action();
}
}
package com.wxisme.strategy;
/**
* 策略的具体实现类
* @author wxisme
*
*/
public class StrategyOne implements Strategy{
@Override
public void action() {
System.out.println("one action.");
}
}
package com.wxisme.strategy;
/**
* 策略的具体实现类
* @author wxisme
*
*/
public class StrategyTwo implements Strategy{
@Override
public void action() {
System.out.println("two action.");
}
}
package com.wxisme.strategy;
/**
* 面向客户的客户端,只保留封装好的策略。没有具体的实现。
* 应用:CRM的报价策略,GUI编程中布局管理器的底层架构
* @author wxisme
*
*/
public class Client {
public static void main(String[] args) {
/**
* 运用多态,面向接口编程,可维护可扩展。
* 可以把new StrategyOne()改成任何一个实现类
* 而不用修改其他任何代码。
*/
Strategy strategy = new StrategyOne();
//用上下文交互类封装策略接口,用户可以通过此交互类来调用任何一个策略。
Context c = new Context(strategy);
//调用执行方法就能实现不同的策略动作。
c.executeAction();
}
}