《HeadFirst设计模式》学习笔记——策略模式

策略模式:
定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
The Strategy Pattern defines a family of algorithms, encapsulates each one, and makes interchangeable. Strategy lets the algorithm vary independently from clients that use it.

设计基础:
抽象 Abstraction
封装 Encapsulation
多态 Polymorphism
继承 Inheritance

设计原则:
1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
2.针对接口编程,而不是针对实现编程。
3.多用组合,少用继承。

要点:
Knowing the OO basics does not make you a good OO designer.
知道OO基础,并不足以让你设计出良好的OO系统。

Good OO designs are reusable, extensible and maintainable.
良好的OO设计必须具备的特性:可复用、可扩充、可维护。

Patterns show you how to build systems with good OO design qualities.
模式可以让我们建造出具有良好OO设计质量的系统。

Patterns are proven OO experience.
模式被认为是历经验证的OO设计经验。

Patterns don't give you code, they give you general solutions to design problems. You apply them to your specific application.
模式不是代码,而是针对设计问题的通用解决方案。你可以把它们应用到特定的应用中。

Patterns arenot invented, they are discovered.
模式不是被发明的,而是被发现的。

Most patterns and principles address issues of change in software.
大多数的模式和原则,都着眼于软件保护的主题。

Most patterns allow some part of a system to vary independently of all other parts.
大多数的模式都允许系统局部改变独立于其他部分。

We often try to take what varies in a system and encapsulate it.
我们常把系统中会变化的部分抽出来封装。

Patterns provide a shared language that can maximize the value of your communication with other developers.
模式让开发人员之间有共享的语言,能够最大化沟通的价值。


心得:
Java的接口对应c++的纯虚函数。


实例:
设计一个鸭子类,具有飞翔行为,可动态设置其飞翔动作。


实现:

接口:
class CFlyBehavior  
{
public:
CFlyBehavior();
virtual ~CFlyBehavior();
virtual void fly() = 0;
};
飞翔行为,此后的所有飞翔算法都集成此超类

算法族:
class CFlyWithWings : public CFlyBehavior  
{
public:
virtual void fly();
CFlyWithWings();
virtual ~CFlyWithWings()
        {printf("I'm fly with wings\n");}
};

class CFlyNoWay : public CFlyBehavior  
{
public:
virtual void fly();
CFlyNoWay();
virtual ~CFlyNoWay()
        {printf("I can't fly\n");}
};

鸭子类:

class CFlyBehavior;
class CDuck  
{
public:
void SetFlyBehavior(CFlyBehavior *fb){SAFEDELETE(m_flyBehavior ); m_flyBehavior = fb;}
void fly(){if(m_flyBehavior != NULL) m_flyBehavior->fly();}
CDuck(CFlyBehavior *fb = NULL){SetFlyBehavior(fb);}
virtual ~CDuck(){SAFEDELETE(m_flyBehavior );}
private:
CFlyBehavior *m_flyBehavior;
};

测试:
int main()
{
CDuck duck;
duck.fly();
duck.SetFlyBehavior(new CFlyWithWings());
duck.fly();

CDuck rduck;
rduck.fly();
rduck.SetFlyBehavior(new CFlyWithRocket());
rduck.fly();
system("pause");
return 0;
}

结果:

完整代码下载:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值