Modelo de estrategia Head First

definición

El modo de estrategia define una familia de algoritmos y los encapsula por separado para que puedan ser reemplazados entre sí, este modo hace que los cambios de algoritmo sean independientes de los clientes que utilizan el algoritmo.

Comportamiento de vuelo encapsulado

//飞行行为接口类
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";
    }
};

Comportamiento de croar encapsulado

//呱呱叫行为接口类
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";
    }
};

Clase de cliente

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";
    }
};

Codigo del cliente

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();
}

Diagrama de clases estático

Inserte la descripción de la imagen aquí

Criterios de diseño

  • Use más combinación, menos herencia
  • Programación para la interfaz, no para la implementación (programación para la superclase)
  • Descubra qué puede ser necesario cambiar en la aplicación, aíslelos y no los mezcle con el código que no cambia

Supongo que te gusta

Origin blog.csdn.net/amwha/article/details/88211339
Recomendado
Clasificación