- 博客(29)
- 收藏
- 关注
转载 Memento模式 备忘录模式
Memento模式的关键就是要在不破坏封装行的前提下,捕获并保存一个类的内部状态,这样就可以利用该保存的状态实施恢复操作。为了达到这个目标,可以在后面的实现中看到我们采取了一定语言支持的技术。
2015-05-13 10:53:05
389
转载 State模式 状态模式
实现至少有以下两个问题:1)当状态数目不是很多的时候,Switch/case可能也可以搞定,但是当状态数目很多的时候,维护一大组的Switch/case语句将是一件异常困难并且容易出错的事情。2)状态逻辑和动作实现没有分离,在很多的系统实现中,动作的实现代码直接写在状态的逻辑当中。者带来的后果就是系统的扩展性和维护得不到保证。
2015-05-12 15:36:07
318
转载 Strategy模式 策略模式
Strategy模式和Template模式要解决的问题是相同(类似)的,都是为了给业务逻辑(算法)具体实现和抽象接口之间的解耦。Strategy模式将逻辑封装到一个类,通过组合的方式将具体算法的实现在组合对象中实现,再通过委托的方式将抽象接口的实现委托给组合对象实现。
2015-05-12 15:02:08
298
转载 Proxy模式 代理模式
1)创建开销大的对象时候,比如显示一副图片,我们将创建的过程交给代理去完成,即虚代理2)为网络上的对象创建一个局部的本地代理3)对对象进行控制访问的时候,4)智能指针 Subject *sub = new ConcreteSubject(); Proxy *p = new Proxy(sub); p->Request(); Proxy::Proxy()
2015-05-11 17:50:49
325
转载 facade模式 界面统一模式
在遇到以下情况使用Facade模式:1、当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过Facade
2015-05-11 17:14:36
473
转载 Flyweight模式 享元模式
面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可能显得很庞大,比如,字处理软件,如果以每个文字都作为一个对象,几千个字,对象数就是几千,无疑耗费内存,那么我们还是要"求同存异",找出这些对象群的共同点,设计一个元类,封装可以被共享的类,另外,还有一些特性是取决于应用(context),是不可共享的,这也是Flyweight中两个重要概念--内部状态intrinsic和外部状态
2015-05-11 16:40:32
293
转载 Composite模式 组合模式
我们经常可能要递归构建树状的组合结构,此模式提供了很好的解决方案 Leaf *l = new Leaf(); l->Operation(); Composite *com = new Composite(); com->Add(l); com->Operation(); 调用LEAF方法 Component *ll = com->GetChild(0);
2015-05-11 11:53:21
260
原创 Adapter模式 适配器模式
类模式和对象模式类模式是通过继承实现的,对象模式通过定义对象实现 Adapter模式提供了将一个类(第三方库)的接口转化为客户(购买使用者)希望的接口。
2015-05-11 10:39:18
492
转载 Bridge模式
将抽象部分与它的实现部分分离,使得它们可以独立地变化,提高低耦合AbstractionImp *imp = new ConcreateAbstractionImpA; Abstraction *abs = new RefinedAbstraction(imp); abs->Operation(); 这样抽象类就可以使用ConcreateAbstractionImpA的方法
2015-05-11 10:13:52
321
转载 C++浅复制 多态 友元 纯虚函数虚类
1.复制构造函数要求构造函数的参数为自身类类型的引用类名::类名(const 类名 & 引用名,。。。)调用复制构造函数的时机当说明语句建立对象时,可以调用复制构造函数进行数据初始化,另外,当函数具有类类型传值参数或者返回类类型值时,都需要调用复制构造函数,完成局部对象的初始化。深复制和浅复制当类的数据成员是简单数据类型时,在创建对象时,默认复制构造函数工作的很好。
2015-05-07 16:05:16
721
转载 Builder模式---创建者
解决的问题:当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要把复杂对象的创建过程和这个对象的表示分离开来。#include "stdafx.h"#include "Director.h"#include "Builder.h"Director::Director(Builder * bld){ _bld = bld;}Director::
2015-05-07 14:52:52
277
转载 Singleton模式 单例模式
保证全局只有一个类的对象,创建一个唯一的对象,通过提供一个static的接口instance来获得这个唯一的实例。
2015-05-07 14:07:13
240
转载 AbstactFactory模式 (抽象工厂)
解决的问题:要创建一组相关或者相互依赖的对象AbstractFactory模式关键就是将这一组对象的创建封装到一个用于创建对象的类(ConcreteFactory)中,维护这样一个创建类总比维护n多相关对象的创建过程要简单的多。优点1、分离了具体的类。抽象工厂模式帮助你控制一个应用创建的对象的类,因为一个工厂封装创建产品对象的责任和过程。它将客户和类的实现分离,客户通过他们的抽象接
2015-05-07 11:14:32
287
转载 factory工厂模式
1.factory模式两个重要的功能:1)定义创建对象的接口,封装了对象的创建;2)使得具体化类的工作延迟到了子类中。Factory模式仅仅局限于一类类(就是说Product是一类,有一个共同的基类),如果我们要为不同类的类提供一个对象创建的接口,那就要用AbstractFactory了。 我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用
2015-05-07 10:35:26
274
转载 VC 检测程序内存泄露的CMemoryState类
CMemoryState提供了便利的方式以检测程序中的“内存空洞”。“内存空洞”发生于已经为一个对象分配了内存,而在长期不再需要时也没有释放。这样的内存空洞最终可能导致内存溢出错误。CMemoryState类没有基类。有几种方式来为程序分配或重新分配内存:·使用运行库中的函数的malloc/free家族。·使用Windows API内存管理函数LocalAlloc/
2015-04-01 10:05:24
602
转载 VC 没有标题栏拖动窗口
比如果应用程序自己绘制的界面没有标题栏,那我们怎么来拖动程序呢?那么就可以添加下面消息:UINT CMainWindow::OnNcHitTest (CPoint point){UINT nHitTest = CFrameWnd::OnNcHitTest (point);if (nHitTest == HTCLIENT) //如果是客户区nHitTest = HTCAPTION
2015-03-30 14:11:53
370
转载 VC 封装按钮
#pragma once#include "afxwin.h"class CSkinButton : public CButton{public: CSkinButton(void); ~CSkinButton(void); DECLARE_DYNAMIC(CSkinButton)public: void LoadBitmaps(HBITMAP Normal
2015-03-27 17:22:45
377
转载 vc 滚动条使用
void CDIALOGNOSE::OnSize(UINT nType, int cx, int cy){ CDialog::OnSize(nType, cx, cy); SCROLLINFO si; int nVScrollMax = 0; m_nVScrollPos = m_nVPageSize = 0; if (cy nVScrollMax = m_
2015-03-27 15:26:26
828
转载 CMENU类
自绘菜单闻怡洋译 在这里提供一个C++类(CCustomMenu),该类是CMenu的子类,并且拥有自绘能力。它可以向你提供以下的功能:设置字体颜色。设置高亮度颜色。设置高亮度时的风格。设置选中时和在普通状态下的菜单显示的图标。设置显示图标大小。在CCustomMenu中定义了结构MENUDATA,你必须根据你的需要填充该结构,并且在增加菜单时提供该结构的指针(调用
2015-03-10 16:37:15
555
转载 VC ADO链接ACCESS数据库
#include "stdafx.h"#include using namespace std;#import "c:\program files\common files\system\ado\msado15.dll" \ no_namespace rename ("EOF", "adoEOF") int _tmain(int argc, _TCHAR* argv[])
2015-03-09 20:27:10
419
转载 STL 容器
1.顺序性容器Vector 从后面快速的插入与删除,直接访问任何元素,使用时最好先分配区域,效率比较高,因为Vector分配内存和销毁比较消耗性能deque(双向队列) 从前面或后面快速的插入与删除,直接访问任何元素,向deque 两端添加或删除元素的开销很小。它不需要重新分配空间,所以向末端增加元素比vector 更有效,deque 是对vector 和list
2015-01-30 11:44:12
381
转载 钩子函数SetWindowsHookEx检测鼠标
HHOOK g_hMouseHook;g_hMouseHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseHookProc, (HINSTANCE)AfxGetInstanceHandle(), AfxGetThread()->m_nThreadID);LRESULT CALLBACK xxxx::MouseHookProc
2015-01-29 10:20:38
1325
转载 MFC SDI 执行流程
在MFC程序设计的学习过程中最令人感到难受,甚至于有时会动摇学习者信心的就是一种对于程序的一切细节都没有控制权的感觉。这种感觉来源于学习者不知道一个MFC程序是如何运行起来的(即一个MFC程序的执行流程)和MFC程序的设计思想和机制,即使是写过Windows程序的学习者,也会感到非常迷惘并且无从下手。而这种感觉的出现会使大家认为自己离开了书本上的例子就无法设计编制程序。下面我就来说一说一个MFC具
2015-01-27 17:02:55
2160
转载 判定鼠标点击某一控件
if (pMsg->message == WM_LBUTTONDOWN) { /*HWND hwnd = ::GetFocus(); int id = ::GetDlgCtrlID(hwnd); if (id == IDC_EDIT1) { ::HideCaret(hwnd); return TRUE; }*/ }
2015-01-16 14:41:17
488
原创 VC 操作注册表
HKEY hKey; char szProductType[255]; DWORD dwBufLen=255; LONG lRet; lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Software\bmModem\BMT_HSPA_Modem_2", 0, KEY_QUERY_VALUE, &hKey ); if( lRet !
2015-01-10 13:28:02
504
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人