-
策略模式
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
-
适用性
1)许多相关的类仅仅是行为有异。Strategy模式提供了一种用多个行为中的一个行为来配置一个类的方法。
2)需要使用一个算法的不同变体。例如:加减乘除
3)算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
4)一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。 -
举例
例如小明是一个有讲究的人,早餐吃胡辣汤加油条,中餐吃小炒牛肉健康餐,晚餐吃白面馒头就西红柿炒鸡蛋。这种情况符合相关的类仅仅是行为有异。
-
UML类图
-
代码示例
- 定义支持所有算法的公共Meal抽象类。Context使用这个抽象类来调用某ConcreteStrategy定义的算法。
package com.jin.demo.DesignPatterns.Strategy; /** * 定义一个抽象类 * @auther jinsx * @date 2019-05-09 09:38 */ public abstract class Meal { // 定义一个吃饭的方法 public abstract void eat(); }
- 以Meal抽象类实现具体的算法
早餐
午餐package com.jin.demo.DesignPatterns.Strategy; /** * 早餐 * @auther jinsx * @date 2019-05-09 09:41 */ public class Breakfast extends Meal { @Override public void eat() { System.out.println("早餐吃胡辣汤加油条...我的最爱"); } }
晚餐package com.jin.demo.DesignPatterns.Strategy; /** * 午餐 * @auther jinsx * @date 2019-05-09 09:44 */ public class Lunch extends Meal{ @Override public void eat() { System.out.println("中餐吃小炒牛肉健康餐...有营养干活不累"); } }
package com.jin.demo.DesignPatterns.Strategy; /** * 晚餐 * @auther jinsx * @date 2019-05-09 09:49 */ public class Supper extends Meal { @Override public void eat() { System.out.println("晚餐吃白面馒头就西红柿炒鸡蛋,再来一碗米汤...吃好睡好"); } }
- 用一个Context对象来配置。
package com.jin.demo.DesignPatterns.Strategy; /** * 早中晚餐有了,还要有一个餐厅 * @auther jinsx * @date 2019-05-09 09:52 */ public class Context { // 构造函数,要吃那顿饭 private Meal meal; public Context(Meal meal) { this.meal = meal; } // 开始吃饭啦 public void eat(){ this.meal.eat(); } }
- 创建一个测试类
package com.jin.demo.DesignPatterns.Strategy; /** * @auther jinsx * @date 2019-05-09 09:58 */ public class TestStrategy { public static void main(String[] args) { Context context; context = new Context(new Breakfast()); context.eat(); context = new Context(new Lunch()); context.eat(); context = new Context(new Supper()); context.eat(); } }
- 执行测试结果
早餐吃胡辣汤加油条...我的最爱 中餐吃小炒牛肉健康餐...有营养干活不累 晚餐吃白面馒头就西红柿炒鸡蛋,再来一碗米汤...吃好睡好
- 定义支持所有算法的公共Meal抽象类。Context使用这个抽象类来调用某ConcreteStrategy定义的算法。
-
点击Java之23种设计模式查看更多的设计模式
Java设计模式之策略模式
最新推荐文章于 2024-06-19 17:11:56 发布