针对不同的节日退出不同的促销活动。
public interface Strategy {
public void show();
}
/**
* 具体策略类
*/
public class StrategyA implements Strategy {
@Override
public void show() {
System.out.println("买一赠一");
}
}
/**
* 具体策略类
*/
public class StrategyB implements Strategy {
@Override
public void show() {
System.out.println("满100减50");
}
}
/**
* 上下文环境
*/
public class SalesMan {
// 聚合策略类对象
private Strategy strategy;
public SalesMan(Strategy strategy) {
this.strategy = strategy;
}
// 调用具体的策略
public void showPromotion() {
strategy.show();
}
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
}
public class Client {
public static void main(String[] args) {
SalesMan salesMan = new SalesMan(new StrategyA());
salesMan.showPromotion();
}
}
优点:
策略类之间可以自由切换:由于策略类都实现了同一个接口,所以他们之间可以自由切换。(本来就是实现类实现接口,多态本来都可以自由切换,这也不只是策略特有的)。
易于扩展:增加一个新的实现只需要添加一个具体的策略类即可,基本上不需要改变原有的代码,符合开闭原则。(增加新的实现类对原程序本来影响就小,这就是多态的特性)
避免使用多重条件选择语句(if else),充分体现面向对象设计思想。只是将原本的if else 分支的代码进一步向上抽象到类中,使得整体if else 代码简洁了而已,仍然去不掉if else,想去掉还要靠其它方式。