
Head First 设计模式
vsooda
这个作者很懒,什么都没留下…
展开
-
装饰者模式
装饰者模式:动态地将责任附加到对象上。若要扩张功能,装饰者提供了比继承更有弹性的替代方案。 装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的。 装饰者与被装饰者对象具有相同的超类型。 #include #include using namespace std; class Beverage { public : string description ;原创 2012-08-13 15:53:04 · 474 阅读 · 0 评论 -
设计模式小结
花了将近一周的时间,将书看了一遍,代码用c++实现了一下。还有几个由于需要java支持或者一时碰到代码问题没有解决。有点累了,没激情了,暂时不搞。以后再说。 主要还是代码实现过程中碰到了不少问题,c++的指针要特别注意,还有一些要求似乎更加严格,相信通过这次的“翻译”,对于c++的认识应该更深了,为以后如果还需要“翻译”打下一个基础。或许,下次就不是“翻译”了,而是“著作”,自己写代码了原创 2012-08-17 13:54:27 · 489 阅读 · 0 评论 -
模式综合应用
鸭子例子的综合应用。背景参见原书。以下为c++实现。 #include #include using namespace std; class Observer; //解决类的循环依赖 class QuackObservable { public: virtual void registerObserver(Observer* observer){ } virtual void not原创 2012-08-17 10:13:22 · 711 阅读 · 0 评论 -
组合模式
组合模式允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。 代码背景为:餐厅里面的菜单,菜单里有菜单构成了树形结构。 #include #include #include using namespace std; class MenuComponent { public: virtual void add(MenuCompone原创 2012-08-15 15:59:39 · 494 阅读 · 0 评论 -
模板方法模式
模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。还可以使用钩子对可选部分进行判断。 #include #include using namespace std; class CaffeineBeverage { public: void prepareRecipe() { boilWate原创 2012-08-14 21:48:26 · 465 阅读 · 0 评论 -
适配器模式
转换接口,在java中无法使用多重继承,所以只有对象适配器,而c++不仅有对象适配器,还有类适配器。 代码比较简单,火鸡的接口转化为鸭子。 #include using namespace std; class Duck { public: virtual void display() { } void swim() { cout << "All ducks float,原创 2012-08-14 17:10:49 · 409 阅读 · 0 评论 -
命令模式
最经典的例子是餐馆点餐菜。服务员用菜单记录,厨师按照菜单做菜。服务员不需要知道菜具体怎么做的。还可以实现日志记录,最后照着菜单付钱。 #include #include using namespace std; class Command { public : virtual void execute(){ } virtual void undo() { } Command oper原创 2012-08-14 16:26:33 · 494 阅读 · 0 评论 -
工厂模式
工厂模式包括简单工厂,工厂方法,抽象工厂。 简单工厂虽然不是真正的设计模式,但仍不失为一个简单的方法,可以将客户程序从具体类解耦。 工厂方法使用继承:把对象的创建委托给子类,子类实现工厂方法创建对象。 抽象工厂使用对象组合:对象的创建被实现在工厂接口所暴露出来的方法中。 简单工厂将创建对象代码从客户端移到服务端,看起来貌似并没有什么作用,但是其实,客户端一般有多个,服务端只有一个,将此代码原创 2012-08-14 09:47:17 · 678 阅读 · 0 评论 -
单件模式
在有的程序中某些类只能有一个实例,比如说线程池管理,注册表等等。 实现上通常采取将Sigleton的构造函数设置为私有,然后public一个getInstance函数,在该函数里面判断是否已经实例化该单件,若没有,则实例化,否则返回已经实例的对象。 c++代码中没有提供可跨平台的加锁方法,先附上java代码,慢慢寻求c++的实现。如果不需要实现多线程版本,c++实现也是很简单 packa原创 2012-08-14 11:13:34 · 665 阅读 · 0 评论 -
策略模式 p19 Duck
#include using namespace std; class FlyBehavior { public: virtual void fly() = 0; }; class FlyWithWings : public FlyBehavior { public: virtual void fly() { cout << "I'm flying!!" << endl; }原创 2012-08-12 14:20:30 · 875 阅读 · 0 评论 -
观察者模式observer
有一个subject, 一群observer, subject的实例保存了observer的列表,当发生改变的时候可以通知observer进行update。 #include #include #include using namespace std; class Observer { public: virtual void update(float temp, floa原创 2012-08-13 14:46:02 · 641 阅读 · 1 评论 -
迭代器模式
迭代器模式提供一种方法顺序访问聚合对象中的各个元素,而不暴露其内部的表示。 迭代器模式让我们能够游走于聚合内部的每一个元素,而不暴露其内部的表示。 本程序的背景是两家餐厅合并了,他们分别用数组和list保存其菜单,又都不想修改。服务员在报菜单的时候总是需要两种方法分别遍历两个菜单。此时定义迭代器,使得服务员可以用相同的方法遍历两个菜单。 #include #include #incl原创 2012-08-15 11:12:26 · 499 阅读 · 0 评论