﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-天下-随笔分类-C++设计模式</title><link>http://www.cppblog.com/aaxron/category/21169.html</link><description>记录修行的印记
</description><language>zh-cn</language><lastBuildDate>Mon, 11 Jan 2016 08:42:21 GMT</lastBuildDate><pubDate>Mon, 11 Jan 2016 08:42:21 GMT</pubDate><ttl>60</ttl><item><title>C++ 设计模式之（观察者模式）</title><link>http://www.cppblog.com/aaxron/archive/2016/01/11/212643.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 11 Jan 2016 08:34:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2016/01/11/212643.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/212643.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2016/01/11/212643.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/212643.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/212643.html</trackback:ping><description><![CDATA[<div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000; ">//</span><span style="color: #008000; ">UiBase.h</span><span style="color: #008000; "><br />
</span>#pragma&nbsp;once<br />
#include&nbsp;&lt;list&gt;<br />
<br />
<span style="color: #0000FF; ">namespace</span>&nbsp;dui<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;std::list;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;Event<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>*&nbsp;&nbsp;&nbsp;&nbsp;sender;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;argl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;&nbsp;&nbsp;&nbsp;argu;<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;IControl{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;OnCreate(Event*&nbsp;_event)=0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">virtual&nbsp;bool&nbsp;OnPaint(Event*&nbsp;_event)=0;</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;};<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;(IControl::*EVENT_PROC)(Event*);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;EventManager<br />
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;Notify(EVENT_PROC&nbsp;method,Event*&nbsp;_event);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;AddNotifier(IControl*&nbsp;control);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;RemoveNotifier(IControl*&nbsp;control);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list&lt;IControl*&gt;&nbsp;m_ctrls;<br />
&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Button:<span style="color: #0000FF; ">public</span>&nbsp;IControl&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;OnCreate(Event*&nbsp;_event);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">virtual&nbsp;bool&nbsp;OnPaint(Event*&nbsp;_event);</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Edit:<span style="color: #0000FF; ">public</span>&nbsp;IControl&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;OnCreate(Event*&nbsp;_event);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">virtual&nbsp;bool&nbsp;OnPaint(Event*&nbsp;_event);</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;<br />
<br />
<br />
<br />
}</div>
<br />
<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000; ">//</span><span style="color: #008000; ">UiBase.cpp</span><span style="color: #008000; "><br />
</span>#include&nbsp;"stdafx.h"<br />
#include&nbsp;"UiBase.h"&nbsp;<br />
<br />
<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;dui;<br />
<br />
<span style="color: #0000FF; ">void</span>&nbsp;EventManager::AddNotifier(IControl*&nbsp;control)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_ctrls.push_back(control);<br />
}<br />
<span style="color: #0000FF; ">void</span>&nbsp;EventManager::RemoveNotifier(IControl*&nbsp;control)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;list&lt;IControl*&gt;::iterator&nbsp;iter;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(iter&nbsp;=&nbsp;m_ctrls.begin();iter!=m_ctrls.end();)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;*iter&nbsp;==&nbsp;control){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter&nbsp;=&nbsp;m_ctrls.erase(iter);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<span style="color: #0000FF; ">bool</span>&nbsp;EventManager::Notify(EVENT_PROC&nbsp;method,Event*&nbsp;_event)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("\r\n\r\nEventManager::Notify()&nbsp;Entry\r\n--------------------------------------\r\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;list&lt;IControl*&gt;::iterator&nbsp;iter;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(iter&nbsp;=&nbsp;m_ctrls.begin();iter!=m_ctrls.end();iter++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*iter-&gt;*method)(_event);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">if&nbsp;(!(*iter-&gt;*method)(_event))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />
}&nbsp;&nbsp;<br />
<br />
<span style="color: #0000FF; ">bool</span>&nbsp;Button::OnCreate(Event*&nbsp;_event){&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("Button&nbsp;OnCreate()&nbsp;Entry,event.type=%d&nbsp;\r\n",_event-&gt;type);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />
}&nbsp;<br />
<br />
<span style="color: #0000FF; ">bool</span>&nbsp;Edit::OnCreate(Event*&nbsp;_event){&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("Edit&nbsp;OnCreate()&nbsp;Entry,event.type=%d&nbsp;\r\n",_event-&gt;type);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />
} &nbsp;</div>
<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">Main.cpp</span><span style="color: #008000; "><br /></span><br />#include&nbsp;"stdafx.h"<br /><br />#include&nbsp;"UiBase.h"&nbsp;&nbsp;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;_tmain()<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;dui;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Event&nbsp;_event;<br />&nbsp;&nbsp;&nbsp;&nbsp;_event.type&nbsp;=&nbsp;0x1001;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;EventManager&nbsp;event_manager;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Button*&nbsp;btn&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Button();<br />&nbsp;&nbsp;&nbsp;&nbsp;event_manager.AddNotifier(btn);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Edit*&nbsp;edit&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Edit();<br />&nbsp;&nbsp;&nbsp;&nbsp;event_manager.AddNotifier(edit);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;event_manager.Notify(&amp;IControl::OnCreate,&amp;_event);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;event_manager.RemoveNotifier(btn);<br />&nbsp;&nbsp;&nbsp;&nbsp;event_manager.Notify(&amp;IControl::OnCreate,&amp;_event);<br />&nbsp;&nbsp;&nbsp;&nbsp;system("pause");&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;&nbsp;&nbsp;<br />}&nbsp;</div><img src ="http://www.cppblog.com/aaxron/aggbug/212643.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2016-01-11 16:34 <a href="http://www.cppblog.com/aaxron/archive/2016/01/11/212643.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>