`
link1987330
  • 浏览: 22654 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

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

    例子:肯德基推出一系列套餐,套餐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
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics