Java设计模式之策略模式

  • 策略模式

    定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

  • 适用性

    1)许多相关的类仅仅是行为有异。Strategy模式提供了一种用多个行为中的一个行为来配置一个类的方法。
    2)需要使用一个算法的不同变体。例如:加减乘除
    3)算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
    4)一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

  • 举例

    例如小明是一个有讲究的人,早餐吃胡辣汤加油条,中餐吃小炒牛肉健康餐,晚餐吃白面馒头就西红柿炒鸡蛋。这种情况符合相关的类仅仅是行为有异。

  • UML类图
    策略模式(Strategy)

  • 代码示例

    • 定义支持所有算法的公共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();
          }
      }
      
    • 执行测试结果
      早餐吃胡辣汤加油条...我的最爱
      中餐吃小炒牛肉健康餐...有营养干活不累
      晚餐吃白面馒头就西红柿炒鸡蛋,再来一碗米汤...吃好睡好
      
  • 点击Java之23种设计模式查看更多的设计模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值