场景引入:
小镇的咖啡馆生意越来越好了,但是来自不同地方的顾客也越来越多,有的人喜欢咖啡加糖,有的人喜欢咖啡加牛奶,有的喜欢加炼乳。。。
咖啡伪代码:
class 咖啡{
void addSth(String param){
if(param.equals("糖")){
System.out.println("咖啡加糖。。。。");
}else if(param.equals("牛奶")){
System.out.println("咖啡牛奶。。。。");
}
}
}
每次出一种新品种,都要在if..else if..后添加,违反了对开闭原则的,对修改关闭的原则。
我们可以尝试以下策略模式来解决这个问题。
1.声明一个策略接口;
2.往后只要新增加一种口味,都生成一种新的具体策略实现类;
3.在生成咖啡时,将具体的策略赋值给咖啡,就可以生成不同口味的咖啡啦!
是不是听起来很棒,那我们来看一下具体的代码实现吧
代码展示:
策略接口:
//策略接口
interface Strategy{
void add();
}
加糖策略:
//加糖策略
class SugarStrategy implements Strategy{
public void add(){
System.out.println("add Sugar....");
}
}
加牛奶策略:
//加牛奶策略
class MilkStrategy implements Strategy{
public void add(){
System.out.println("add Milk....");
}
}
具体的咖啡接收类:
class Coffee{
//策略
private Strategy strategy;
public void setStrategy(Strategy strategy){
this.strategy=strategy;
}
//烧水
private void boilWater(){
System.out.println("boil water...");
}
//煮咖啡
void cook(){
System.out.println("cook coffee....");
}
//倒咖啡到杯子中
private void dumpWater(){
System.out.println("dump water into cup...");
}
public void doSth(){
boilWater();
cook();
dumpWater();
if(strategy != null){
strategy.add();
}
}
}
测试类:

//测试类
public class Test{
public static void main(String[] args){
Strategy strategy = new MilkStrategy();
Coffee coffee = new Coffee();
coffee.setStrategy(strategy);
coffee.doSth();
System.out.println("============================");
strategy = new SugarStrategy();
coffee.setStrategy(strategy);
coffee.doSth();
}
}
测试结果:

