Strategy Pattern 策略模式(一)
2015-06-18 16:40
393 查看
最近在看《Head First 设计模式》这本书,挺好的一本书,比较好理解,因为以前没接触设计模式,挑了这本入门。
不过因为这本书程序语言用的Java的,所以我想慢慢试试,把它转移到C++中来。Java里不支持多重继承,interface里只有函数声明,并不包含实现,这应该是首先要牢记心中的两个重要地方,extend 就是继承(是IS-A的关系),implements就是实现接口(是HAS-A的关系)。书中也有重点强调。
以下是我的代码
类图:
![](http://img.blog.csdn.net/20150618193249380)
总结:
策略模式封装变化,通过组合来达到多变的目的。例如这里绿鸭子这个类,你可以让他嘎嘎叫也可以让他不叫,或者直接动态的调整。main里绿鸭子本来是flywithwings,通过动态调整,我们让他flynoway。
关于c++用抽象类来模拟Java的Interface的参考
http://www.cnblogs.com/xieduo/articles/790583.html
http://www.drdobbs.com/cpp/c-interfaces/184410630 more patient
http://stackoverflow.com/questions/318064/how-do-you-declare-an-interface-in-c
不过因为这本书程序语言用的Java的,所以我想慢慢试试,把它转移到C++中来。Java里不支持多重继承,interface里只有函数声明,并不包含实现,这应该是首先要牢记心中的两个重要地方,extend 就是继承(是IS-A的关系),implements就是实现接口(是HAS-A的关系)。书中也有重点强调。
以下是我的代码
#include<iostream> using std::cout; using std::endl; //*********************************************** // Fly and Quack Interface. //*********************************************** class FlyBehavior { public : virtual void fly() = 0; }; class QuackBehavior { public: virtual void quack() = 0; }; //*********************************************** // Main Class. //*********************************************** class Duck { //IDemo *pObject = new Child; protected: FlyBehavior *flybehavior; QuackBehavior *quackbehavior; public: Duck(){}; void swim() { cout<<"All float."<<endl; } virtual void display(){}; void performQuack() { quackbehavior->quack(); } void performFly() { flybehavior->fly(); } void setQuackBehavior(QuackBehavior* qb) { quackbehavior = qb; } void setFlyBehavior(FlyBehavior* fb) { flybehavior = fb; } }; //*********************************************** // Implement to all FlyBehavior Interface. //*********************************************** class FlyWithWings : public FlyBehavior { public: void fly() { cout<<"Flying"<<endl; } }; class FlyNoway: public FlyBehavior { public: void fly() { cout<< "Can't fly"<<endl; } }; //*********************************************** // Implement to all QuackBehavior Interface. //*********************************************** class Squeak :public QuackBehavior { public: void quack() { cout<<"Gaga"<<endl; } }; class Mute: public QuackBehavior { public: void quack() { cout<<"Silence"<<endl; } }; //*********************************************** // // Inherit from Duck. //*********************************************** class GreenDuck: public Duck { public: GreenDuck() { //IDemo *pObject = new Child; quackbehavior = new Squeak; flybehavior = new FlyWithWings; } void display() { cout<<"I'm GreenDuck."<<endl; } }; int main() { Duck* greenduck = new GreenDuck; greenduck->display(); greenduck->performQuack(); greenduck->setFlyBehavior(new FlyNoway); greenduck->performFly(); delete greenduck; getchar(); return 0; }
类图:
总结:
策略模式封装变化,通过组合来达到多变的目的。例如这里绿鸭子这个类,你可以让他嘎嘎叫也可以让他不叫,或者直接动态的调整。main里绿鸭子本来是flywithwings,通过动态调整,我们让他flynoway。
关于c++用抽象类来模拟Java的Interface的参考
http://www.cnblogs.com/xieduo/articles/790583.html
http://www.drdobbs.com/cpp/c-interfaces/184410630 more patient
http://stackoverflow.com/questions/318064/how-do-you-declare-an-interface-in-c
相关文章推荐
- PB中的DataStore是个好东西
- iframe自适应高度
- 【抓包工具】wireshark
- 搭建nexus服务器后,执行mvn出错解决办法
- jQuery 开发之jQuery事件一
- Win10不激活出现卡顿怎么办?
- Reservoir Sampling - 蓄水池抽样
- SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- ls -l文件类型
- java中Math.round(),Math.ceil(),Math.floor()运算
- java ThreadLocal 用法
- 找女神要QQ号码
- 我们一起学习WCF 第二篇WCF承载多个接口
- 阅读《一个程序猿的生命周期》有感
- SeGue 多控制器跨界面传递数据原理
- Oracle Study之--Oracle 11gR2 RAC crs启动故障(CRS-4000)
- 宣布Office 2016 applications DLP 公共预览版
- Django异常 - ImportError: No module named django.core.management
- 面向“接口”编程和面向“实现”编程
- 《构建之法》13,14,15,16,17章读后感