
design pattern
coderchenjingui
失眠爱好者!
展开
-
简单工厂模式--Factory
假设现在有一个游戏开发公司,有的程序员去写各种怪物,有的程序员去创建怪物对象,也就是说:后一种程序员是前一种程序员的客户。让后一种程序员去记住第一种程序员写的很多怪物的类名是很麻烦的,并且也不应该让后一种程序员可以随便修改第一种程序员的代码,即代码分离。这时候,可以利用简单工厂模式,后一种程序员可以利用生产怪物的工厂去创建各种各样的工厂,后一种程序员不需要知道这种怪物是如何被创建的。通过这个工厂,原创 2012-10-18 20:35:12 · 1146 阅读 · 0 评论 -
外观模式--Facade
外观模式:当一个系统很复杂时,系统提供给客户的是一个简单的对外接口,而把里面复杂的结构都封装了起来。客户只需使用这些简单接口就能使用这个系统,而不需要关注内部复杂的结构。为子系统中的一组接口提供一个一致的界面, 外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。举个编译器的例子,假设编译一个程序需要经过四个步骤:词法分析、语法分析、中间代码生成、机器码生成。对于编译器这个系统原创 2012-10-27 09:01:28 · 805 阅读 · 0 评论 -
享元模式--Flyweight
享元模式,就是共享某些对象,如string中的隐式共享。/***假设一篇文章有标题与内容两个属性,我们转载文章时,就没有必要再创建一个文章对象。**或者当我们创建一篇已经存在的文章时,也没有必要创建一个新的文章对象。**此时,可以采用Flyweight享元模式**但是又必须表现出某些不同的特性,如一篇文章可以有不同的访问者*/#include #include原创 2012-10-27 10:23:55 · 941 阅读 · 0 评论 -
组合模式--Composite
假设有一个公司,下面有直属人事部,直属餐饮部,和一个子公司,但是子公司也有自己的直属人事部,直属餐饮部。要清楚的是子公司包括其直属子部门在一起也属于总公司的一个部门。即:子公司也是一种部门。#include #include #include #include using namespace std;//公司基类class Company{public: Company(){原创 2012-10-25 21:35:39 · 876 阅读 · 0 评论 -
模版模式--Template
/***template模式**对于某一个业务逻辑在不同的对象中有不同的实现细节,但是整体的逻辑框架相同**将逻辑框架抽象在基类中,定义好细节的接口,子类实现细节*/#include using namespace std;class Paper{public: virtual ~Paper(){} void PrintAllAnswer() { answer1();原创 2012-10-24 20:59:33 · 701 阅读 · 0 评论 -
装饰模式--Decorator
如果要为已经定义好的类添加新的职责,通常我们会定义一个新类继承自定义好的类。但是,如果职责越累越多,则继承体系会越来越庞大,继承的深度也会越来越深。而Decorator装饰模式提供了一种给类添加职责的方法,不是通过继承,而是通过组合。假设现在我们有一个文本框,想用边框和滚动条去装饰。#include using namespace std;class Component{pu原创 2012-10-24 20:22:45 · 871 阅读 · 0 评论 -
桥接模式--bridge
此文参考《大话设计模式》当我们设计要做一款软件,假设为QQ。要考虑两种平台,windows和linux。我们可能做出这样的继承体系。我们可能写出这样的代码:#include using namespace std;class QQ{public: virtual ~QQ(){} virtual void show()=0;};class WindowsQQ:pu原创 2012-10-21 12:31:14 · 682 阅读 · 0 评论 -
适配器模式--Adapter
如果要开发一个跨平台的语言或库,应该怎么做?就像现在的跨平台语言Java和跨平台库Qt,但是这两种库有本质区别。Java:一次编译,到处运行。需借助JVM运行Qt:一次编写,到处编译。编译后可直接运行。这里以Qt为例,如何做到一次编写,到处编译呢?各种平台提供的API未必一致,为什么还可以跨平台编译呢,猜测原因是因为Qt编译器对外提供了统一的借口,而实现中分别调用相应平台的API。原创 2012-10-21 13:19:53 · 826 阅读 · 0 评论 -
原型模式--ProtoType
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其中有一个词很重要,那就是拷贝。可以说,拷贝是原型模式的精髓所在。有时,我们需要创建一个对象的拷贝,这样这个对象不仅具有和原对象相同的属性,并且对此对象的修改还不会影响原对象。然而,我们却不知道需要拷贝的真实类型是什么,这时,我们可以利用原型模型。#include #include using namespace std;原创 2012-10-20 16:30:37 · 791 阅读 · 0 评论 -
建造者模式--Builder
Builder模式所面对的情况是:各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将他们组合在一起的算法却相对稳定。就像女娲造人一样,不管是早男人女人,胖人瘦人都是造头部,胳膊,身体,腿。具体是怎么制造的有女娲决定,但是这几个身体部位的组合是确定的。#include using namespace std;//人的基类class原创 2012-10-20 12:42:02 · 718 阅读 · 0 评论 -
单例模式--Singleton
假设我们电脑只有一个打印机,我们用一个类来管理打印机资源,如果像一般的类一样,使用者可以创建多个类的实例,那么势必会造成系统资源的大量浪费。此时,我们可以利用单例模式,只创建一个打印机对象。#include using namespace std;class SingletonPrinter{private: static SingletonPrinter* instance;p原创 2012-10-19 12:53:56 · 767 阅读 · 0 评论 -
抽象工厂模式--AbstactFactory
http://blog.youkuaiyun.com/qq575787460/article/details/8087289简要的说了下简单工厂模式。接着继续说抽象工厂模式。假设现在不是要产生怪物A,怪物B。而是要要产生简单的怪物A,困难的怪物A,简单的怪物B,困难的怪物B。这是不能简单的把怪物作为基类,而是要把怪物A,怪物B作为两个基类,然后分别派生出简单的怪物A,困难的怪物A以及简单的怪物B,困难的怪原创 2012-10-18 22:36:22 · 938 阅读 · 0 评论 -
代理模式--Proxy
代理模式:一个类别作为另一个类别的接口,实现逻辑与实现的分离。#include using namespace std;class Image{public: virtual ~Image(){}; virtual void show()=0;protected: Image(){}};class BigImage:public Image{p原创 2012-10-27 09:29:00 · 848 阅读 · 0 评论