logo资料库

大话设计模式实现(C++版).doc

第1页 / 共56页
第2页 / 共56页
第3页 / 共56页
第4页 / 共56页
第5页 / 共56页
第6页 / 共56页
第7页 / 共56页
第8页 / 共56页
资料共56页,剩余部分请下载后查看
(一)简单工厂模式
(二)策略模式
策略与工厂结合
单一职责原则
开放――封闭原则
里氏代换原则
依赖倒转原则
(三)装饰模式
(四)代理模式
(五)工厂方法模式
(六)原型模式
(七)模板方法模式
迪米特法则
(八)外观模式
(九)建造者模式(生成器模式)
(十)观察者模式
(十一)抽象工厂模式
(十二)状态模式
(十三)适配器模式
(十四)备忘录模式
(十五)组合模式
(十六)迭代器模式
(十七)单例模式
(十八)桥接模式
(十九)命令模式
(二十)责任链模式
(二十一)中介者模式
(一)简单工厂模式........................................................................................................................ 2 (二)策略模式................................................................................................................................ 4 策略与工厂结合........................................................................................................................ 6 单一职责原则............................................................................................................................ 6 开放――封闭原则....................................................................................................................6 里氏代换原则............................................................................................................................ 7 依赖倒转原则............................................................................................................................ 7 (三)装饰模式................................................................................................................................ 7 (四)代理模式................................................................................................................................ 9 (五)工厂方法模式...................................................................................................................... 11 (六)原型模式.............................................................................................................................. 13 (七)模板方法模式......................................................................................................................15 迪米特法则 .............................................................................................................................. 16 (八)外观模式.............................................................................................................................. 16 (九)建造者模式(生成器模式)..............................................................................................19 (十)观察者模式.......................................................................................................................... 23 (十一)抽象工厂模式..................................................................................................................28 (十二)状态模式.......................................................................................................................... 32 (十三)适配器模式......................................................................................................................34 (十四)备忘录模式......................................................................................................................37 (十五)组合模式.......................................................................................................................... 39 (十六)迭代器模式......................................................................................................................45 (十七)单例模式.......................................................................................................................... 46 (十八)桥接模式.......................................................................................................................... 47 (十九)命令模式.......................................................................................................................... 49 (二十)责任链模式......................................................................................................................52 (二十一)中介者模式..................................................................................................................54 (二十二)享元模式......................................................................................错误!未定义书签。 (二十三)解释器模式..................................................................................错误!未定义书签。 (二十四)访问者模式..................................................................................错误!未定义书签。
(一)简单工厂模式 主要用于创建对象。新添加类时,不会影响以前的系统代码。核心思想是用一个工厂来 根据输入的条件产生不同的类,然后根据不同类的 virtual 函数得到不同的结果。 GOOD:适用于不同情况创建不同的类时 BUG:客户端必须要知道基类和工厂类,耦合性差 (工厂类与基类为关联关系) 例: //基类 class COperation { public: int m_nFirst; int m_nSecond; virtual double GetResult() { double dResult=0; return dResult; } }; //加法 class AddOperation : public COperation { public: virtual double GetResult() { return m_nFirst+m_nSecond; } }; //减法
class SubOperation : public COperation { public: virtual double GetResult() { return m_nFirst-m_nSecond; } }; //工厂类 class CCalculatorFactory { public: static COperation* Create(char cOperator); }; COperation* CCalculatorFactory::Create(char cOperator) { COperation *oper; //在 C#中可以用反射来取消判断时用的 switch,在 C++中用什么呢?RTTI?? switch (cOperator) { case '+': oper=new AddOperation(); break; case '-': oper=new SubOperation(); break; default: oper=new AddOperation(); break; } return oper; } 客户端 int main() { int a,b; cin>>a>>b; COperation * op=CCalculatorFactory::Create('-'); op->m_nFirst=a; op->m_nSecond=b; cout<GetResult()<
return 0; } (二)策略模式 定义算法家族,分别封装起来,让它们之间可以互相替换,让算法变化,不会影响 到用户 GOOD:适合类中的成员以方法为主,算法经常变动;简化了单元测试(因为每个 算法都有自己的类,可以通过自己的接口单独测试。 策略模式和简单工厂基本相同,但简单工厂模式只能解决对象创建问题,对于经常 变动的算法应使用策略模式。 BUG:客户端要做出判断 例 //策略基类 class COperation { public: int m_nFirst; int m_nSecond; virtual double GetResult() { double dResult=0; return dResult; } }; //策略具体类—加法类 class AddOperation : public COperation { public: AddOperation(int a,int b)
{ m_nFirst=a; m_nSecond=b; } virtual double GetResult() { return m_nFirst+m_nSecond; } }; class Context { private: COperation* op; public: Context(COperation* temp) { op=temp; } double GetResult() { return op->GetResult(); } }; //客户端 int main() { int a,b; char c; cin>>a>>b; cout<<”请输入运算符:; cin>>c; switch(c) { case ‘+’: Context *context=new Context(new AddOperation(a,b)); cout<GetResult()<
策略与工厂结合 GOOD:客户端只需访问 Context 类,而不用知道其它任何类信息,实现了低耦合。 在上例基础上,修改下面内容 class Context { private: COperation* op; public: Context(char cType) { switch (cType) { case '+': op=new AddOperation(3,8); break; default: op=new AddOperation(); break; } } double GetResult() { return op->GetResult(); } }; //客户端 int main() { int a,b; cin>>a>>b; Context *test=new Context('+'); cout<GetResult()<
当变化发生时,我们就创建抽象来隔离以后发生同类的变化。 开放――封闭原则是面向对象的核心所在。开发人员应该对程序中呈现出频繁变化 的那部分做出抽象,拒绝对任何部分都刻意抽象及不成熟的抽象。 里氏代换原则 一个软件实体如果使用的是一个父类的话,那么一定适用其子类。而且它察觉不出 父类对象和子类对象的区别。也就是说:在软件里面,把父类替换成子类,程序的行为没有 变化。 子类型必须能够替换掉它们的父类型。 依赖倒转原则 抽象不应该依赖细节,细节应该依赖抽象。即针对接口编程,不要对实现编程。 高层模块不能依赖低层模块,两者都应依赖抽象。 依赖倒转原则是面向对象的标志,用哪种语言编写程序不重要,如果编写时考虑的 是如何针对抽象编程而不是针对细节编程,即程序的所有依赖关系都终止于抽象类或接口。 那就是面向对象设计,反之那就是过程化设计。 (三)装饰模式 动态地给一个对象添加一些额外的职责(不重要的功能,只是偶然一次要执行),就增 加功能来说,装饰模式比生成子类更为灵活。建造过程不稳定,按正确的顺序串联起来进行 控制。 GOOD:当你向旧的类中添加新代码时,一般是为了添加核心职责或主要行为。而当需 要加入的仅仅是一些特定情况下才会执行的特定的功能时(简单点就是不是核心应用的功 能),就会增加类的复杂度。装饰模式就是把要添加的附加功能分别放在单独的类中,并让 这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择地、按顺序地使用装饰功 能包装对象。
例 #include #include using namespace std; //人 class Person { private: string m_strName; public: Person(string strName) { m_strName=strName; } Person(){} virtual void Show() { cout<<"装扮的是:"<Show(); } }; //T 恤 class TShirts: public Finery { public: virtual void Show() { cout<<"T Shirts"<Show();
分享到:
收藏