Strategy设计模式

Strategy设计模式举例。

看图:

代码实现:

cpp 复制代码
#include <iostream>

using namespace std;

class FlyBehavior {
public:virtual void fly() = 0;
};

class QuackBehavior {
public:virtual void quack() = 0;
};

class FlyWithWings :public FlyBehavior {
public:void fly() { cout << "fly with wings!" << endl; }
};

class FlyNoWay :public FlyBehavior {
public:void fly() { cout << "can not fly!" << endl; }
};

class Quack :public QuackBehavior {
public:void quack() { cout << "gaga!" << endl; }
};

class Squeak :public QuackBehavior {
public:void quack() { cout << "fricktion !" << endl; }
};

class QuackNoWay :public QuackBehavior {
public :void quack() { cout << "can not sound!" << endl; }
};

class Duck {
protected:
	FlyBehavior *flyBehavior;
	QuackBehavior *quackBehavior;
public:
	void fly() { flyBehavior->fly(); }
	void quack() { quackBehavior->quack(); }
	virtual void display() = 0;

};


class RubberDuck :public Duck {
public:
	RubberDuck() {
		flyBehavior = new FlyNoWay;
		quackBehavior = new Squeak;
	}
	void display() { cout <<"rubber duck" << endl; };
};

细节:

  1. 在Duck类中,new的是虚类(virtual)或者虚方法类,而在RubberDuck中new的是实类。接下来,调用实类的方法时,会根据不同的实类调用不同的实方法。
  2. new FlyNoWay 也可以写成new FlyNoWay(),但是最好写成new FlyNoWay()。
  3. 结合本例,图中的聚合/集合该如何理解?
相关推荐
亦暖筑序12 小时前
Java 8老系统Browser Agent实战:三层拦截把AI操作后台变成可审计流程
java·后端·设计模式
青禾网络3 天前
Web 前端如何接入 AI 音效生成:从零到可用的完整方案
人工智能·设计模式
ZJPRENO4 天前
吃透软件开发六大设计原则,告别烂代码
设计模式
咖啡八杯4 天前
GoF设计模式——命令模式
java·设计模式·架构
花椒技术4 天前
HJPusher / HJPlayer SDK 实践:我们为什么把直播推播链路拆成一套可复用能力
设计模式·harmonyos·直播
艺艺生辉5 天前
迭代器模式-"我也想被增强for循环"
设计模式
咖啡八杯6 天前
GoF设计模式——策略模式
java·后端·spring·设计模式
槑有老呆8 天前
别再手搓 Prompt 了,那个叫"手动挡循环"
设计模式
用户6919026813398 天前
Vibe Coding 开发项目的基本范式
人工智能·设计模式·代码规范