C++设计模式:策略模式

策略模式:符合开闭原则,如果if else过多或者有待增加时宜使用,节省高级缓存指令空间占用

行为型设计模式,不同的创建型对象的具体行为

分析重构前的代码:
class Review {
 public:
  enum FoodType { CHINA, JAPAN };

 public:
  void isYummy() {
    if (type_ == FoodType::CHINA)
      ::printf("好吃\n");
    else if (type_ == FoodType::JAPAN)
      ::printf("美味しい\n");
  }

 private:
  FoodType type_;
};

上面的代码看似无可厚非,但是把时间轴拉长,如果后面需要加入对其他菜系的评价,就破坏了开闭原则。
首先需要在枚举中增加枚举,然后在方法中增加判断。

class Review {
 public:
  enum FoodType { CHINA, JAPAN, GERMANY };

 public:
  void isYummy() {
    if (type_ == FoodType::CHINA)
      ::printf("好吃\n");
    else if (type_ == FoodType::JAPAN)
      ::printf("美味しい\n");
    else if (type_ == FoodType::GERMANY)
      ::printf("Echt lecker\n");
  }

 private:
  FoodType type_;
};
接下来我们对代码进行重构:
class Review {
 public:
  Review(Food *food) : food_{food} {}

  void isYummy() { this->food_->taste(); }

 private:
  Food *food_;
};
class Food {
 public:
  virtual ~Food() {}

  virtual void taste() = 0;
};
class ChinaFood : public Food {
 public:
  ~ChinaFood() override {}
  void taste() override { ::printf("好吃\n"); }
};
class JapanFood : public Food {
 public:
  ~JapanFood() override {}
  void taste() override { ::printf("美味しい\n"); }
};
class GermanFood : public Food {
 public:
  ~GermanFood() override {}
  void taste() override { ::printf("Echt lecker\n"); }
};

class Review 就变得稳定。内部遵从了开闭原则,对于该类不再修改任何代码,体现了代码的复用性。
class Review 内部成员food_在运行时绑定了谁,是由外部传入的(这里一般使用工厂模式来构造Food的具体对象),实现了解耦,充分体现了单一职责。

类图:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

歪锅锅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值