C++设计模式_策略模式练习代码

 

2015-11-07 22.52.12

策略模式的优缺点:

优点:

1.策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活的增加新的算法或行为

2.使用策略模式可以避免多重条件选择语句。

3.策略模式提供了一种算法的复用机制。由于将算法单独提取出来封装在策略类中,因此不同的环境类可以方便地复用这些策略类。

缺点:

1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。(也就是说策略模式只实用与客户端知道所有算法或行为的情况)

2.策略模式将造成系统产生很多具体策略类,任何细小的变化都将导致系统要新增一个具体策略类。

#include <iostream>

using namespace std;


class AbstractStratgy
{
    public:
        virtual void useWeapon() = 0;
};

class KinfeStratgy :public AbstractStratgy
{
    public:
        virtual void useWeapon()
        {
            cout<<"使用匕首攻击"<<endl;
        }
};

class Ak47Stratgy :public AbstractStratgy
{
    public:
        virtual void useWeapon()
        {
            cout<<"使用AK47攻击"<<endl;
        }
};

class Hero
{
    public:
        void setStrategy(AbstractStratgy* stratgy)
        {
            this->stratgy = stratgy;
        }

        void fight()
        {
            cout<<"---开始战斗---"<<endl;
            stratgy->useWeapon();
        }
    private:
        AbstractStratgy* stratgy;
};
int main()
{
    AbstractStratgy* k = new KinfeStratgy;
    AbstractStratgy* a = new Ak47Stratgy;

    Hero* hero = new Hero;
    cout<<"远程小兵来了,使用近身武器"<<endl;
    hero->setStrategy(k);
    hero->fight();

    cout<<"------------------------"<<endl;

    cout<<"近战小兵来了,使用远程攻击"<<endl;
    hero->setStrategy(a);
    hero->fight();


    return 0;
}
#include <iostream>
using namespace std;
//抽象的策略
class SellAbstractStrategy
{
public:
	//通过商品的原件 返回一个新的 价格
	virtual double getPrice(double price) = 0;
};

//无条件打八折
class SellStrategyA :public SellAbstractStrategy
{
public:
	virtual double getPrice(double price)  {
		return price * 0.8;
	}
};

//如果满200 减100
class SellStrategyB :public SellAbstractStrategy
{
public:
	virtual double getPrice(double price)  {

		if (price > 200) {
			price -= 100;
		}

		return price;
	}
};

class Item {
public:
	Item(string name, double price) {
		this->name = name;
		this->price = price;
	}

	//更换策略的 方法
	void setStrategy(SellAbstractStrategy * strategy) {
		this->sellStrategy = strategy;
	}

	//返回商品的价格
	double getPrice() {
		return this->sellStrategy->getPrice(this->price);
	}

private:
	SellAbstractStrategy *sellStrategy; //一个销售的策略
	string name;
	double price;
};


int main(void)
{
	Item it("屌丝鞋", 250);

	SellAbstractStrategy *sa = new SellStrategyA;
	SellAbstractStrategy *sb = new SellStrategyB;

	cout << "上午 执行策略A销售, " << endl;
	it.setStrategy(sa);
	cout << it.getPrice() << endl;

	cout << "-----" << endl;
	cout << "下午执行策略B销售" << endl;
	it.setStrategy(sb);
	cout << it.getPrice() << endl;
	
	return 0;
}

 

暂无评论

发表评论