设计模式学习笔记之三---策略模式

策略模式:定义一系列算法,分别分装起来,这些算法相互间可以替换并且不会影响到使用算法的客户。

例子:肯德基推出一系列套餐,套餐A(一个巨无霸汉堡,一杯大可,一份薯条)、套餐B(双份汉堡,两杯中可,一份薯条)、套餐C(全家桶,一堆堆鸡块鸡翅,一大瓶可乐)。假设一个顾客来点餐只能点ABC套餐中的一个,按一般写法代码如下:
Maximal

public class MainClass {
/**
* 普通实现方式
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String mealName = null;

System.out.println("Please enter your main meal:");
mealName = br.readLine();
if("mealA".equals(mealName)) {
System.out.println("一个巨无霸汉堡,一杯大可,一份薯条");
} else if("mealB".equals(mealName)) {
System.out.println("双份汉堡,两杯中可,一份薯条");
} else if("mealC".equals(mealName)) {
System.out.println("全家桶,一堆堆鸡块鸡翅,一大瓶可乐");
} else {
System.out.println("您点的套餐不存在");
}
}
}


使用策略模式实现方式:

//套餐接口
public interface Meal {
public void chooseMeal();
}

//套餐A算法类
public class MealA implements Meal {
/**
* A套餐具体实现方法
*/
@Override
public void chooseMeal() {
System.out.println("套餐A:");
System.out.println("一个巨无霸汉堡,一杯大可,一份薯条");
}
}

//套餐B算法类
public class MealB implements Meal {
/**
* B套餐具体实现方法
*/
@Override
public void chooseMeal() {
System.out.println("套餐B:");
System.out.println("双份汉堡,两杯中可,一份薯条");
}
}

//套餐C算法类
public class MealC implements Meal {
/**
* C套餐具体实现方法
*/
@Override
public void chooseMeal() {
System.out.println("套餐C:");
System.out.println("全家桶,一堆堆鸡块鸡翅,一大瓶可乐");
}
}

//上下文
public class MealContext {
Meal meal = null;
public MealContext(Meal meal) {
this.meal = meal;
}
//上下文接口
public void chooseMeal() {
meal.chooseMeal();
}
}

//业务代码
public class MainClassForStrategy {
/**
* 策略模式业务代码
* @param args
*/
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String mealName = null;
MealContext context = null;

System.out.println("Please enter your main meal:");
mealName = br.readLine();
//if...else代码可用简单工厂模式来优化
if("mealA".equals(mealName)) {
context = new MealContext(new MealA());
} else if("mealB".equals(mealName)) {
context = new MealContext(new MealB());
} else if("mealC".equals(mealName)) {
context = new MealContext(new MealC());
} else {
System.out.println("您点的套餐不存在");
}
//调用具体实现算法
context.chooseMeal();
}
}

相比普通实现代码,策略模式实现代码的优点:
1、修改某个具体算法的实现方式对其它算法以及业务代码没有任何影响。(低耦合度)
2、新增一个算法对业务代码的改动很小,配合工厂模式下几乎不需要改动业务代码,只需要增加相应算法的具体实现即可。(扩展性强)

策略模式适用的场景:有几种相似的行为,或者说算法,客户端需要动态地决定使用哪一种,那么可以使用策略模式,将这些算法封装起来供客户端调用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值