首页 > 代码库 > Head First 之 Design Pattern(一):Strategy Pattern && 初入设计模式殿堂
Head First 之 Design Pattern(一):Strategy Pattern && 初入设计模式殿堂
头一回阅读《Head First 设计模式》,感觉语言生动形象,把一个个抽象的模式描述的浅显易懂,就像白话文一样。
正如作者推荐如何使用这本书。
你懂Java吗(不太懂... 会C++不影响吧)?
你想学习、了解、记得并应用设计模式,以及其所基于的OO设计原则吗(是的,我正在深入学习C++呢)?
你是不是更喜欢一种轻松愉悦的学习环境(absolutely)?
这本书正是我需要的~ "Head First"就是那些不断学习的人们,像他们致敬,共勉加油~
使用设计模式最好的原则【把模式装进大脑里,然后在你的设计和原有的设计中,寻找使用他们的合适机会】
什么是设计模式?【过去的前辈们在设计OO时针对特定的一类对象积累下来的经验,值得我们学习和继承之】
模式不是代码,是一种通用的解决方案。用好来是善事。
------------------------------------------------ Strategy ---------------------------------------------------
设计原则之一:【把变化的和不变的部分分开,不要把它们放在一块,将变化封装成接口】
设计原则之二:【针对接口编程,而不是实现编程】
可以将接口做成ABC(abstract base class),具体的Implement实现代表不同的各种策略。
超类里有所有通用的不变的行为,其他继承它即可。
设计原则之三:【多用组合(composition),少用继承(inherihence)】
【有一个HAS-A】可能比【是一个IS-A】更好。
【策略模式】定义了算法族(?针对同一对象的不同操作或者策略?),将其分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
然后自己用C++实现的鸭类,有疏漏的地方请指教:
<span style="font-family:Microsoft YaHei;"><span style="font-size:18px;"><span style="font-size:14px;">// StrategyPattern.h // 抽象基类 class FlyBehavior { public: FlyBehavior(); virtual ~FlyBehavior(); virtual void Fly() = 0; }; class QuackBehavior { public: QuackBehavior(); virtual ~QuackBehavior(); virtual void Quack() = 0; }; // 鸭子飞的行为 class FlyWithWings : public FlyBehavior { public: FlyWithWings(); ~FlyWithWings(); void Fly(); }; class FlyNoWing : public FlyBehavior { public: void Fly(); }; // 鸭子叫的行为 class QuackGua : public QuackBehavior { public: void Quack(); }; class Squeak : public QuackBehavior { public: void Quack(); }; class MuteQuack : public QuackBehavior { public: void Quack(); }; // 超类 class Duck { protected: FlyBehavior * m_flyBehavior; QuackBehavior * m_quackBahavior; public: Duck(); virtual ~Duck(); void Swim(); virtual void Display(); void PerformFly(); void PerformQuack(); void SetFlyBehavior(FlyBehavior * flyBehavior); void SetQuackBehavior(QuackBehavior * quackBahavior); }; class MallarDuck : public Duck { public: MallarDuck(); virtual ~MallarDuck(); void Display(); };</span><span style="color: rgb(51, 0, 153); font-size: 18px;"> </span></span></span>
STRATEGY—跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,单目的都是为了得到MM的芳心,我的追MM锦囊中有好多Strategy哦。
策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。
<span style="font-family:Microsoft YaHei;"><span style="font-size:18px;"><span style="font-size:14px;">// StrategyPattern.cpp #include "StrategyPattern.h" // 超类的实现 Duck::Duck() { } Duck::~Duck() { if(nullptr != flyBehavior) { delete flyBehavior; } if(nullptr != quackBehavior) { delete quackBehavior; } cout << "~Duck() implement" << endl; } void Duck::Swim() { cout << "This duck can float..." << endl; } void Duck::Display() { cout << "Duck::Display" << endl; } void Duck::PerformFly() { m_flyBehavior->Fly(); } void Duck::PerformQuack() { m_quackBahavior->Quack(); } void Duck::SetFlyBehavior(FlyBehavior * flyBehavior) { m_flyBehavior = flyBehavior; } void Duck::SetQuackBehavior(QuackBehavior * quackBahavior) { m_quackBahavior = quackBahavior; } // 玩具鸭子的实现 MallarDuck::MallarDuck() { m_flyBehavior = new QuackGua; m_quackBahavior = new FlyWithWings; } MallarDuck::~MallarDuck() { } void MallarDuck::Display() { cout << "Display MallarDuck" << endl; } // 封装的接口实现 FlyBehavior::FlyBehavior() { } FlyBehavior::~FlyBehavior() { cout << "~FlyBehavior()" << endl; } void FlyWithWings::Fly() { cout << "I can fly!!" << endl; } void FlyNoWay::fly() { cout << "I can't fly..." << endl; } void QuackGua::quack() { cout << "Quack Gua Gua ~~" << endl; } void Squeak::quack() { cout << "Squeak Squeak ~~" << endl; } void MuteQuack::quack() { cout << "I am MuteQuack..." << endl; } int main(int argc,char* argv[]) { Duck * mallard = new MallarDuck(); mallard->display(); mallard->swim(); mallard->performQuack(); mallard->performFly(); mallard->setFlyBehavior(new FlyNoWay()); mallard->performFly(); delete mallard; return 0; } </span></span></span>
同理,在生活的很多其他地方也会用到【策略模式】,下面就是游戏中的一个例子,加深理解和印象!!
同样的Character是超类,King、Queue、Troll、Knight是继承超类的子类;WeaponBehavior是封装算法族的接口,KnifeBahavior、BowAndArrowBahavior、AxeBehavior和SwordBehavior是接口的四种实现策略。
转载请注明出处:http://blog.csdn.net/aall3210_tsingloon/article/details/27567915