Modèle de stratégie Head First

définition

Le mode stratégie définit une famille d'algorithmes et les encapsule séparément afin qu'ils puissent être remplacés les uns par les autres. Ce mode rend l'algorithme change indépendant des clients qui utilisent l'algorithme.

Comportement de vol encapsulé

//飞行行为接口类
class Flybehavior
{
public:
    Flybehavior(){}
    //删除基类,所以这里析构函数要用虚函数
    virtual ~Flybehavior(){}
    virtual void fly() = 0;
};

//具体的飞行类行为
class FlyWithWings :public Flybehavior
{
public:
    void fly()
    {
        qDebug()<< "Fly With Wings";
    }
};
//具体的飞行类行为
class FlyNoWay :public Flybehavior
{
public:
    void fly()
    {
        qDebug()<< "Fly No Way";
    }
};
//具体的飞行类行为
class FlyWithRock :public Flybehavior
{
public:
    void fly()
    {
        qDebug()<< "Fly With Rock";
    }
};

Comportement de coassement encapsulé

//呱呱叫行为接口类
class QuackBehavior
{
public:
    QuackBehavior(){}
    //删除基类,所以这里析构函数要用虚函数
    virtual ~QuackBehavior(){}
    virtual void quack() = 0;
};
//具体叫的行为类
class Quack:public QuackBehavior
{
public:
    void quack()
    {
        qDebug()<< "Quack";
    }
};
//具体叫的行为类
class Squeak:public QuackBehavior
{
public:
    void quack()
    {
        qDebug()<< "i can Squeak";
    }
};
//具体叫的行为类
class MuteQuack:public QuackBehavior
{
public:
    void quack()
    {
        qDebug()<< "Mute Quack";
    }
};

Classe de client

class Duck
{
public:
    Duck():quackBehavior(0),flybehavior(0){}
    void swim();
    void display();

    //行为接口
    void performQauck();
    void performFly();

    //替换算法接口
    void setQauckBehavior(QuackBehavior*);
    void setFlyBehavior(Flybehavior*);

protected:
    //使用组合方式,而不是继承
    QuackBehavior *quackBehavior;
    Flybehavior * flybehavior;
};

void Duck::performQauck()
{
    quackBehavior->quack();//委托给QuackBehavior类实现
}

void Duck::performFly()
{
    flybehavior->fly();//委托给Flybehavior类实现
}

void Duck::setQauckBehavior(QuackBehavior *q)
{
    if(quackBehavior)
        delete quackBehavior;//这里要求基类的析构函数是虚函数

    quackBehavior = q;
}

void Duck::setFlyBehavior(Flybehavior *f)
{
    if(flybehavior)
        delete flybehavior;

    flybehavior = f;
}

class MallardDuck :public Duck
{
public:
    MallardDuck()
    {
        quackBehavior = new Squeak();
        flybehavior = new FlyWithWings();
    }

    void swim()
    {
        qDebug() << "i am mallard duck ,i can swim";
    }
    void display()
    {
         qDebug() << "i am mallard duck";
    }
};

Code client

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    //父类指针指向子类实例
    Duck *duck1 = new MallardDuck();

    //对接口编程
    duck1->performFly();
    duck1->performQauck();
    duck1->setFlyBehavior(new FlyWithRock);
    duck1->performFly();
    duck1->performFly();

    return a.exec();
}

Diagramme de classe statique

Insérez la description de l'image ici

Principes de conception

  • Utilisez plus de combinaisons, moins d'héritage
  • Programmation pour l'interface, pas pour l'implémentation (programmation pour la superclasse)
  • Découvrez ce qui peut devoir être changé dans l'application, isolez-les et ne les mélangez pas avec le code qui ne change pas

Je suppose que tu aimes

Origine blog.csdn.net/amwha/article/details/88211339
conseillé
Classement