模式一:策略模式(Strategy Pattern)——实现可替换算法
来源:互联网 发布:linux删除用户密码 编辑:程序博客网 时间:2024/05/22 00:51
- 策略模式
定义算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
- 应用分析——变化部分的实现
一种类型经常变化的部分,如果放在基类里面,变化的子类需要重新实现,不利于代码重用;
如果定义在抽象类里面,通过继承自不同的抽象类,可以获得不同的行为,这也可以实现,通常,继承增加代码之间的耦合度,用组合可以实现松耦合;
因此,我们定义行为的算法族(抽象类),分别封装实现(派生出不同的行为对象),使它们之间可以相互替换,这样,我们用相同的接口组合不同的行为对象对象,就可以得到不同的行为。
- 实例介绍——不同的鸭子:都会游泳;展示不同的外表;有的鸭子会飞,有的不会飞;有的呱呱叫,有的吱吱叫,有的不会叫。
- 代码分析
<strong>//file:Behavior.h </strong>#ifndef BEHAVIOR_H#define BEHAVIOR_Hclass FlyBehavior//飞行行为抽象类 {public:virtual void fly()=0;};class FlywithWings:public FlyBehavior//可以飞 {public:virtual void fly();};class FlynoWay:public FlyBehavior//不能飞 {public:virtual void fly();};class QuackBehavior//叫行为抽象类 {public:virtual void quack()=0;};class Quack:public QuackBehavior//呱呱叫 {public:virtual void quack();};class Squeak:public QuackBehavior//吱吱叫 {public:virtual void quack();};class MuteQuack:public QuackBehavior//不叫 {public:virtual void quack();}; #endif
<strong>//file:Behavior.cpp</strong>#include <iostream>#include "Behavior.h"void FlywithWings::fly(){std::cout<<"I'm flying!"<<std::endl;} void FlynoWay::fly(){std::cout<<"I can't fly!"<<std::endl;}void Quack::quack(){std::cout<<"quack!"<<std::endl;}void Squeak::quack(){std::cout<<"squack!"<<std::endl;}void MuteQuack::quack(){std::cout<<"mutequack!"<<std::endl;}
<strong>//file:Duck.h </strong>#ifndef DUCK_H#define DUCK_H#include "Behavior.h"class Duck//鸭子抽象类 {protected://飞行和叫委托给行为对象 ,行为便于扩展 FlyBehavior *ptrFly;QuackBehavior *ptrQuack;public:void swim();virtual void display()=0;void performQuack();void performFly();void setFly(FlyBehavior *ptrFly);void setQuack(QuackBehavior *ptrQuack);};//两种不同的鸭子实现 class RedHeadDuck:public Duck{public:RedHeadDuck();void display();virtual ~RedHeadDuck();};class RubberDuck:public Duck{public:RubberDuck();void display();virtual ~RubberDuck();};#endif
<strong>//file:Duck.cpp</strong>#include "Duck.h"#include <iostream>void Duck::swim(){std::cout<<"I'm swimming!"<<std::endl;}void Duck::performQuack(){ptrQuack->quack();}void Duck::performFly(){ptrFly->fly();}void Duck::setFly(FlyBehavior *ptrFly){this->ptrFly=ptrFly;}void Duck::setQuack(QuackBehavior *ptrQuack){this->ptrQuack=ptrQuack;}void RedHeadDuck::display(){std::cout<<"I'm RedHeadDuck!" <<std::endl;}RedHeadDuck::RedHeadDuck(){ptrFly=new FlywithWings();ptrQuack=new Quack();}RedHeadDuck::~RedHeadDuck(){delete ptrFly;delete ptrQuack;}void RubberDuck::display(){std::cout<<"I'm RubberDuck!" <<std::endl;}RubberDuck::RubberDuck(){ptrFly=new FlynoWay();ptrQuack=new Squeak();}RubberDuck::~RubberDuck(){delete ptrFly;delete ptrQuack;}
<strong>//file:main.cpp</strong>#include <iostream>#include "Duck.h"/*不同的鸭子:都会游泳;展示不同的外表;有的鸭子会飞,有的不会飞;有的呱呱叫,有的吱吱叫,有的不会叫。*/int main(int argc, char** argv) {Duck *duck1=new RedHeadDuck();duck1->display();duck1->swim();duck1->performFly();duck1->performQuack();duck1->setFly(new FlynoWay());//设置飞行方式,动态改变行为 duck1->performFly();Duck *duck2=new RubberDuck();duck2->display();duck2->swim();duck2->performFly();duck2->performQuack();return 0;}
1 0
- 模式一:策略模式(Strategy Pattern)——实现可替换算法
- (C++实现)——策略模式(Strategy Pattern)
- 策略模式——Strategy Pattern
- 策略模式【Strategy Pattern】—— 锦囊妙计
- 策略模式(Strategy Pattern)
- 策略模式(Strategy Pattern)
- 策略模式 Strategy Pattern
- 策略模式(Strategy Pattern)
- 策略模式(Strategy Pattern)
- Strategy Pattern (策略模式)
- 策略模式 Strategy Pattern
- 策略模式【Strategy Pattern】
- 策略模式(Strategy Pattern)
- Strategy Pattern(策略模式)
- 策略模式(STRATEGY PATTERN )
- 策略模式(Strategy Pattern)
- 策略模式Strategy Pattern
- 策略模式(Strategy Pattern)
- &a用于指向变量
- Log4j 使用教程
- Zookeeper(8)-Zookeeper常用命令
- 设计模式--状态模式
- matlab摄像头; MFC控件
- 模式一:策略模式(Strategy Pattern)——实现可替换算法
- 第七周 项目1-建立顺序环形队列算法库
- java 反射
- 微信小程序(应用号)资源汇总整理
- MTK MT6737平台 优化首次开机速度方案
- 使用JavaScript创建模块化的双人对战象棋程序
- python学习笔记 socket、socket server
- Spring整合JMS——基于ActiveMQ实现(一)
- (LeetCode)Excel Sheet Column Number --- Excel 页码映射