2013年9月5日星期四

老鼠跑猫叫主人惊醒c++观察者模式实现 - 浪端之渡鸟

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
老鼠跑猫叫主人惊醒c++观察者模式实现 - 浪端之渡鸟  阅读原文»

这个题目算是比较经典的观察者模式了,老鼠作为一个Subject,主动发出叫声,紧跟着猫由于老鼠的跑而发出叫声,主人也被惊醒,在这里猫跟主人都是被动的,是观察者角色,代码实现如下:

1 class CSubject;
2 //观察者
3 class CObserver
4 {
5 public:
6 CObserver(){}
7 virtual ~CObserver(){}
8 virtual void Update(CSubject* pSubject) = 0;
9 };
10
11 //目标即主题,可理解为由于本对象变化导致其他对象跟随变化
12 class CSubject
13 {
14 public:
15 void Attach(CObserver* pO)
16 {
17 _ls.push_back(pO);
18 }
19 void Detach(CObserver* pO)
20 {
21 _ls.remove(pO);
22 }
23 void Notify()
24 {
25 for (list<CObserver*>::iterator it=_ls.begin();it!=_ls.end();it++)
26 {
27 (*it)->Update(this);
28 }
29 }
30 private:
31 list<CObserver*> _ls;
32 };
33
34 //猫为观察者
35 class CCat:public CObserver
36 {
37 public:
38 CCat(){}
39 virtual ~CCat(){}
40 virtual void Update(CSubject* pSubject){
41 Say();
42 }
43 void Say()
44 {
45 printf("猫叫了\r\n");
46 }
47 };
48
49 //人为观察者
50 class CPerson:public CObserver
51 {
52 public:
53 CPerson(){}
54 virtual ~CPerson(){}
55
56 virtual void Update(CSubject* pSubject){
57 Say();
58 }
59 void Say()
60 {
61 printf("人醒了\r\n");
62 }
63 };
64
65 //老鼠为主题
66 class CMouse:public CSubject
67 {
68 public:
69
70 void Say()
71 {
72 printf("老鼠叫了\r\n");
73 Notify();
74 }
75 };
1 int _tmain(int argc, _TCHAR* argv[])
2 {
3
4 //老鼠跑猫叫主人醒
5 CMouse* pMouse = new CMouse();
6 CCat* pCat = new CCat();
7 CPerson* pPerson = new CPerson();
8
InstallShield 工程类型installscript,如何覆盖安装? - 没文化的Anna  阅读原文»

开始使用的msi工程类型。网上找了资料, 在kevin的博客里找到这条方法 可以通过删除Execute Sequence中的RegisterProduct和PublishProduct两个CA实现同样的需求

试过之后确实是可以 重复安装的,但是 开始菜单的中的卸载是无法卸载的,而且控制面板是不能显示该程序的。所以此方法不可行。

换了个工程类型,使用 installscript工程类型,此类型的 脚本中 advanced下面有个 OnShowUI,即存放的检测是已安装、更新、还是第一次安装 的脚本,修改逻辑

如果是第一次安装执行OnFirstUIbefore() (不必修改)

如果是升级执行 OnUpdateUIBefore();

如果是已经安装 默认是执行的OnMaintUIBefore(); 则修改为 继续执行 OnFirstUIbefore();

此时调试 覆盖安装会覆盖不了文件。调用一个修复方法FeatureReinstall(); 就可以 覆盖文件了

在 卸载的快捷方式中添加一个参数 -removeonly,检测判断此参数为卸载功能。

修改代码如下:

function OnShowUI()
BOOL bMaintenanceMode, bUpdateMode;
string szIgnore, szTitle;
begin

// Enable dialog caching
Enable( DIALOGCACHE );

// Determine what events to show.
bUpdateMode = FALSE;
bMaintenanceMode
= FALSE;

// Remove this to disabled update mode.
if( UPDATEMODE ) then
bUpdateMode
= TRUE;
endif;

// Remove this to disable maintenance mode.
if ( MAINTENANCE ) then
bMaintenanceMode
= TRUE;
endif;

// Show appropriate UI

// TODO: Enable if you want to enable background etc.
//if ( LoadStringFromStringTable( "TITLE_MAIN", szTitle ) < ISERR_SUCCESS ) then // Load the title string.
// szTitle = IFX_SETUP_TITLE;
//endif;
//SetTitle( szTitle, 24, WHITE );
//Enable( FULLWINDOWMODE );
//Enable( BACKGROUND );
//SetColor( BACKGROUND, RGB( 0, 128, 128 ) );


/*if( bUpdateMode ) then
OnUpdateUIBefore();
else
if ( bMaintenanceMode ) then
OnMaintUIBefore();
else
OnFirstUIBefore();
endif;
endif;
*/
// OnFirstUIBefore();

if( REMOVEONLY ) then
// MessageBox ("卸载", SEVERE);
OnMaintUIBefore();
else
if( bUpdateMode ) then
// MessageBox ("更新", SEVERE);
OnUpdateUIBefore();
else
if ( bMaintenanceMode ) then

if( MessageBox( "您已安装最新版本,是否覆盖安装?" , MB_YESNO ) != IDYES ) then
abort;
endif;
OnFirstUIBefore();
FeatureReinstall();
else
// MessageBox ("第一次安装", SEVERE);
OnFirstUIBefore();
endif;
endif;
endif;

// Move Data
OnMoveData();

//OnFirstUIAfter();
if( REMOVEONLY ) then
OnMaintUIAfter();
else
OnFirstUIAfter();
endif;


/*
if( bUpdateMode ) then
OnUpdateUIAfter();
else
if ( bMaintenanceMode ) then
OnMaintUIAfter();
else
OnFirstUIAfter();
endif;
endif;
*/
// Disable dialog caching
Disable(DIALOGCACHE);

end;


本文链接:http://www.cnblogs.com/daocaorenbx/p/3305162.html,转载请注明。

阅读更多内容

没有评论:

发表评论