- 博客(33)
- 资源 (12)
- 收藏
- 关注
原创 合成/聚合复用原则
合成/聚合复用原则合成/聚合复用原则,尽量使用合成/聚合,尽量不要使用类继承。对象的继承关系是在编译时就定义好的,所以,无法再运行时改变从父类继承的实现。子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当你需要复用子类时,如果继承下来的实现不合适解决新的问题,则父类必须重写或被其他更合适的类替换。这种依赖关系限制了灵活性并最终限制了复用性。
2012-11-25 21:58:15 1126
原创 桥接模式——Bridge
1、 桥接模式——Bridge将抽象部分与它的实现部分分离,使它们都可以独立地变化。什么叫抽象与它的实现分离,这并不是说,让抽象类与其派生类分离,因为这没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象。由于实现的方式有多种,桥接模式的核心意图就是把这些实现独立出来,让它们独自地变化。这就使得每种实现的变化不会影响其他实现,从而达到应对变化的目的。 桥接模式的
2012-11-25 21:57:00 1025
原创 单例模式——Singleton
1、单例模式——Singleton 单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象,一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且他可以提供一个访问该实例的方法。单例模式的结构图如下:单例模式因为Si
2012-11-25 16:53:25 792
原创 适配器模式——Adapter
1、 适配器模式(Adapter)将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作。 也就是说系统的数据和行为都是正确的但接口不符时,我们应该考虑用适配器模式,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况,比如说需要对早期
2012-11-25 16:20:41 1133
原创 备忘录模式——Memento
1、 备忘录模式(Memento)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。被网络模式结构图Originator(发起人):负责创建一个备忘录,用以记住当前时刻它的内部状态,并可使用备忘录恢复内部状态。Originator可根据需要决定Memento存储Originator的那些内部状态。Mem
2012-11-25 16:17:24 905
原创 状态模式——State
1、 状态模式(State)当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。状态模式的结构图如下:State:抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为。Concret
2012-11-25 15:56:25 844
原创 组合模式——Composition
1、 组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。组合模式的结构图如下:Component为组合中的对象声明接口,在适当情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component的子部件。 Leaf:在组合中表示节点对象,叶节点没有子节点。 Compos
2012-11-24 22:45:18 1427
原创 迭代器模式——Iterator
1、 迭代器模式(Iterator)提供一种方法顺序访问一个聚合对象中各个元素,而不不暴露该对象的内部表示。当需要访问一个聚焦对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑使用迭代器模式。特别当需要对聚焦有多种方式遍历时,更应该考虑迭代器模式,为遍历不同的聚焦结构提供如开始、下一个、是否结束、当前哪一个等统一接口。 迭代器模式的结构图如下:Ag
2012-11-24 22:39:14 1425 2
原创 组合模式——Composite
1、 组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。组合模式的结构图如下:Component为组合中的对象声明接口,在适当情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component的子部件。 Leaf:在组合中表示节点对象,叶节点没有子节点。 Co
2012-11-22 20:58:57 1203
原创 抽象工厂模式——Abstract Factory
1、 抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 结构图如下:AbstractProductA和AbstractProductB是两个抽象产品,之所以为抽象,是因为它们都有可能有两种不同的实现,如:产品1是用SQL数据库实现的、而产品2是由Access数据库实现的。AbstractFactory是一个抽象工厂接口,它
2012-11-22 17:02:01 1235
原创 观察者模式——Observer
1、 观察者模式又叫发布——订阅模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生改变时,会通知所有观察者对象。这个主题对象在状态发生变化时,同会通知所有观察者对象,使它们能够自动更新自己。结构图如下:Subject类,它把所有观察者对象的引用,保存在一个聚集里,每个subject都可以任何数量的观察者。抽象subject
2012-11-21 18:46:20 1178
原创 建造者模式——Builder
1、 情景如果需要将一个复杂对象的构建于它的表示分离,使得同样的构建过程可以创建不同的表示的意图时,我们就需要一个设计模式——建造者模式。 如果我们用了建造者模式,那么用户就只需要指定需要建造的类型就可以得到它们,而具体构建的过程和细节就不需知道了。2、 建造者模式将一个复杂对象的构建于它的表示分离,使得同样的构建过程可以创建不同的表示。结构图如下:
2012-11-21 15:27:28 898
原创 外观模式-Facade
外观模式,为子系统中的一组接口提供一个一致的界面,次模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式的结构图如下:Facade 外观类:知道哪些子系统负责处理请求,将客户的请求代理给适当的子系统对象。SubSystem Classes 子系统类集合,实现了子系统的功能,处理Facade对象指派的任务。注意子类中没有Facade的任何信息,即没有对Fa
2012-11-21 11:05:04 726
原创 迪米特法则
迪米特法则: 如果两个类不必彼此直接通信,那么着两个类就不应当发生直接的项目作用。如果其中一个需要调用另外一个类的某一方法的话,可以通过第三者转发这个调用。 迪米特法则首先强调的前提是在类的结构设计上,每一个类都应当尽量降低成员的访问权限,也就是说,一个类包装好自己的private状态,不需要让别的类知道的字段或行为就不要公开。需要公开的字段通常通过属性来体现了。迪
2012-11-21 10:03:07 1262
原创 模板方法模式
首先,说一下,如果用了继承,并且肯定这个继承有意义,就应该要成为子类的模板,所有重复的代码都应该要上升到父类中去,而不是让每个子类都去重复。当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时。我们通常考虑用模板方法模式来处理。模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中去。模板方法使得子类可以不改变一个算法的结构即可
2012-11-21 10:01:45 742
转载 匈牙利命名法
匈牙利命名法1 匈牙利命名法匈牙利命名法是一种编程时的命名规范。基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。命名要基于容易记忆容易理解的原则。保证名字的连贯性是非常重要的。举例来说,表单的名称为form,那么在匈牙利命名法中可以简写为frm,则当表单变量名称为Switchboard 时,变量全称应该为frmSwitch
2012-11-20 11:12:26 1329
原创 win32应用程序和win32控制台应用程序
win32应用程序是有窗体的(当然也可以没有),有Windows消息循环机制的。而win32控制台应用程序只是在控制台下运行的程序,类似以前dos的程序。Win32 Application和Win32 Console Application 都是工作在32位Windows环境的程序。 其中Win32 Application 就是普通的常见的窗口应用程序,当然有的界面做得比较个性化,
2012-11-20 09:43:07 12068
翻译 MFC —— CWnd::SetCapture
调用此函数后,接下来所有的鼠标事件都被发送到当前的CWnd对象,发送给CWnd对象的事件中不包括鼠标的坐标信息。函数原型: CWnd* SetCapture( );返回值:返回一个指针,该指针指向之前接受所有鼠标输入的窗口对象。如果返回值为空,则说明这样的窗口不存在。这个返回值可能是临时的,所以不能将它存储下来在后面使用。关键点:当CWnd的对象不再要求所有
2012-11-16 09:21:05 2334
原创 将一个string转化为一个long int 型值
int strToInteger(string s){ //s.c_str():将string对象转化为char*对象,返回const char*类型; //strtol,将字符串转换为long int,16代表接受的合法字符为'0'~'9','a'~'f'; char * p; long n = s
2012-11-15 17:27:09 2220
原创 C++标准IO库
1、标准库的类型头文件 类型iostream istream 从流中读取 ostream 写到流中去 iostream 对流进行读写fstre
2012-11-14 14:25:01 679
转载 Attach函数的讲解
CWnd::AttachAttaches a Windows window to a CWnd object. BOOL Attach( HWND hWndNew ); ParametershWndNewSpecifies a handle to a Windows window
2012-11-12 15:44:29 1604
转载 内存管理函数HeapAlloc,LocalAlloc,VirtualAlloc,malloc,new的异同
1. HeapAlloc:HeapALloc是从堆上分配一块内存,且分配的内存是不可移动的(即如果没有连续的空间能满足分配的大小,程序不能将其他零散的空间利用起来,从而导致分配失败)。该分配方法是从一指定地址开始分配,而不像GloabalAlloc是从全局堆上分配,这个有可能是全局,也有可能是局部。函数原型:LPVOIDHeapAlloc( HANDLE hHeap,
2012-11-10 09:47:43 1287
转载 内存管理 - Windows内存管理
内存管理 - Windows内存管理 内存管理对于编写出高效率的Windows程序是非常重要的,这是因为Windows是多任务系统,它的内存管理和单任务的DOS相比有很大的差异。DOS是单任务操作系统,应用程序分配到内存后,如果它不主动释放,系统是不会对它作任何改变的;但Windows却不然,它在同一时刻可能有多个应用程序共享内存,有时为了使某个任务更好地执行,Windows
2012-11-10 09:45:42 807
转载 VC中关于GlobalAlloc,GlobalLock,GlobalUnLock
调用GlobalAlloc函数分配一块内存,该函数会返回分配的内存句柄。 调用GlobalLock函数锁定内存块,该函数接受一个内存句柄作为参数,然后返回一个指向被锁定的内存块的指针。 您可以用该指针来读写内存。 调用GlobalUnlock函数来解锁先前被锁定的内存,该函数使得指向内存块的指针无效。 调用GlobalFree函数来释放内存块。您必须传给该函数一个内存句柄。Gl
2012-11-10 09:15:44 596
转载 HGLOBAL句柄
HGLOBAL 这个是windows 定义的数据类型。这是个句柄,标示一个内存区,不是指针。在对内存区的操作中,一般用指针,从这个handle可以得到指针,然后就可以对内存区进行操作了。 -------------------------------------------------- eg: 开一个200byte的内存区,在里面赋值 HGLO
2012-11-10 08:56:55 1041
转载 setsockopt()用法(参数详细说明)
int setsockopt(SOCKET s,int level,int optname,const char* optval,int optlen);s(套接字): 指向一个打开的套接口描述字level:(级别): 指定选项代码的类型。SOL_SOCKET: 基本套接口IPPROTO_IP: IPv4套接口IPPROTO_IPV6: IPv6套接
2012-11-10 08:46:05 867
转载 组播,单播,广播,多播,泛洪的基本概念
一、什么是组播:1、组播的特点1)什么是组播? 组播是一种数据包传输方式,当有多台主机同时成为一个数据包的接受者时,出于对带宽和CPU负担的考虑,组播成为了一种最佳选择。2)组播如何进行工作? 组播通过把224.0.0.0-239.255.255.255的D类地址作为目的地址,有一台源主机发出目的地址是以上范围组播地址的报文,在网络中,如果有其他主机对于这个
2012-11-08 09:09:12 12898
转载 Windows下API中CreateThread的用法
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to security attributes DWORD dwStackSize, // initial thread stack size LPTHREAD_START_ROUTIN
2012-11-07 17:47:24 3944
原创 Printf()输出格式控制
Printf()输出格式控制1.转换说明符 %a(%A) 浮点数、十六进制数字和p-(P-)记数法(C99) %c 字符 %d 有符号十进制整数 %f 浮点数(包括float和doulbe) %e(%E) 浮点数指数输出[e
2012-11-07 11:48:28 878
转载 scanf, sscanf 函数用法
名称:sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型:Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );int scanf( const char *format [,argument]... ); 说明:sscanf与scanf类似,都是用于输入的,只是后
2012-11-07 11:41:47 486
转载 XML文件格式
XML文件和HTML文件一样,实际上是一个文本文件。显然大家立刻就会明白,创建XML文件最普通的工具和HTML一样,就是“记事本”了。除了 “记事本”之外,当然还有一些更加方便的工具,如XML Notepad、XML Pro、CLIP!XML Editor等,这些工具的一大特点是:能够检查你所建立的XML文件是否符合XML规范。不过,现在这些工具都只有英文版的,并且需要付费使用。当然, 你仍然能够
2012-11-06 10:27:43 1338
转载 C++ CArray
?我们在使用vc进行比较复杂的编程时,经常需要用到复杂的数组结构,并希望能实现动态管理。由于C++并不支持动态数组,MFC提供了一个CArray类来实现动态数组的功能。有效的使用CArray类,可以提高程序的效率。MFC提供了一套模板库,来实现一些比较常见的数据结构如Array,List,Map。CArray即为其中的一个,用来实现动态数组的功能。CArray是从COb
2012-11-03 11:32:10 2902
转载 C++ CArray的使用
templateclass CArray:public CObject参数 TYPE 模板参数指定存储在数组中的对象的类型。TYPE是一个由CArray返回的参数。ARG_TYPE 模板参数指定用于访问存储在数组中对象的参数类型。通常是一个对TYPE的参考。ARG_TYPE是一个传递给CArray的参数。 说明 CArray类支持与C语言的Array相似的数组,但是必要时可
2012-11-03 09:20:28 10551
农场灌溉问题
2012-11-21
整数的二分查找 C语言
2011-03-11
以标志字符进行字符串逆转 C语言
2011-03-11
两只船的装载问题 回溯法
2011-03-11
01背包问题 动态规划法
2011-03-11
归并排序 输入所要排序的整数,进行排序,C语言
2011-03-11
快速排序 C语言编写
2011-03-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人