<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Li Guoliang &#187; 设计模式</title>
	<atom:link href="http://liguoliang.com/tag/%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f/feed/" rel="self" type="application/rss+xml" />
	<link>http://liguoliang.com</link>
	<description>ActionScript Flex Java JEE PHP...</description>
	<lastBuildDate>Mon, 21 May 2012 17:04:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>设计模式之策略模式: Strategy Design Pattern</title>
		<link>http://liguoliang.com/2011/strategy-design-pattern/</link>
		<comments>http://liguoliang.com/2011/strategy-design-pattern/#comments</comments>
		<pubDate>Sun, 17 Jul 2011 09:59:48 +0000</pubDate>
		<dc:creator>Guoliang</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Strategy]]></category>
		<category><![CDATA[设计模式]]></category>

		<guid isPermaLink="false">http://liguoliang.com/2011/%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f%e4%b9%8b%e7%ad%96%e7%95%a5%e6%a8%a1%e5%bc%8f-strategy-design-pattern/</guid>
		<description><![CDATA[适用情景:&#160;&#160; 假如有一组相关的算法, 客户需要从中动态选择一个来使用. 譬如: 学校中的新生分班, 有按照成绩分班, 按照性别分班, 按照住宿类型分班等等.&#160; (当然实际情况中的分班考虑因素会更复杂一些)
最简单的方法是一个Method, 通过判断类型进行相应操作. <p class='read-more'><a href='http://liguoliang.com/2011/strategy-design-pattern/'>More...</a></p><p><p>

----------Post from: <a href="http://liguoliang.com">@LiGuoliang.com, 欢迎回来~</a>----------</p></p>
]]></description>
			<content:encoded><![CDATA[<p>适用情景:&nbsp;&nbsp; 假如有一组相关的算法, 客户需要从中动态选择一个来使用. 譬如: 学校中的新生分班, 有按照成绩分班, 按照性别分班, 按照住宿类型分班等等.&nbsp; (当然实际情况中的分班考虑因素会更复杂一些)</p>
<p>最简单的方法是一个Method, 通过判断类型进行相应操作. 但这样做的是这个Method会巨大无比, 不易维护. 因此我们可使用Strategy模式, 会多一些Interface或Class, 但会降低耦合, 拥有更佳的可扩展性.</p>
<p><a href="http://liguoliang.com/wp-content/uploads/2011/07/SHUPZTTF4MMN_D7DT7TBX0.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="_SHUPZTTF4MMN_D7DT7TBX0" border="0" alt="_SHUPZTTF4MMN_D7DT7TBX0" src="http://liguoliang.com/wp-content/uploads/2011/07/SHUPZTTF4MMN_D7DT7TBX0_thumb.jpg" width="696" height="302"></a><br />(ActionScript)</p>
<p>负责进行分班的主体类包含IClassEnrollStrategy的一个Instance, 对于这个Instance可以使用以下方式注入:</p>
<p>1. 使用Constructor注入到ClassEnroll中, 可在ClassEnroll中增加一个Constructor:<br />ClassEnroll(strategy:IClassEnrollStrategy)</p>
<p>2. 使用Setter注入. ClassEnroll中对strategy的Setter方法:<br />setStrategy(strategy:IClassEnrollStrateStrategy)</p>
<p>3. 在ClassEnroll使用工厂模式创建IClassEnrollStrategy实例.</p>
<p><p>

----------Post from: <a href="http://liguoliang.com">@LiGuoliang.com, 欢迎回来~</a>----------</p></p>
]]></content:encoded>
			<wfw:commentRss>http://liguoliang.com/2011/strategy-design-pattern/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>&lt;&lt;企业应用架构模式[影印版]&gt;&gt;笔记整理</title>
		<link>http://liguoliang.com/2008/%e4%bc%81%e4%b8%9a%e5%ba%94%e7%94%a8%e6%9e%b6%e6%9e%84%e6%a8%a1%e5%bc%8f%e5%bd%b1%e5%8d%b0%e7%89%88%e7%ac%94%e8%ae%b0%e6%95%b4%e7%90%86/</link>
		<comments>http://liguoliang.com/2008/%e4%bc%81%e4%b8%9a%e5%ba%94%e7%94%a8%e6%9e%b6%e6%9e%84%e6%a8%a1%e5%bc%8f%e5%bd%b1%e5%8d%b0%e7%89%88%e7%ac%94%e8%ae%b0%e6%95%b4%e7%90%86/#comments</comments>
		<pubDate>Tue, 18 Nov 2008 15:20:39 +0000</pubDate>
		<dc:creator>Guoliang</dc:creator>
				<category><![CDATA[其他技术]]></category>
		<category><![CDATA[计算机英语]]></category>
		<category><![CDATA[菜鸟学英语]]></category>
		<category><![CDATA[设计模式]]></category>

		<guid isPermaLink="false">http://liguoliang.com/2008/11/571/</guid>
		<description><![CDATA[书很好, 层次清晰, 语言简练. 只是我英语太差, 读的稍稍有些吃力. 把自己理解的记录一下, 即便是错误的, 也先记录下来.<p class='read-more'><a href='http://liguoliang.com/2008/%e4%bc%81%e4%b8%9a%e5%ba%94%e7%94%a8%e6%9e%b6%e6%9e%84%e6%a8%a1%e5%bc%8f%e5%bd%b1%e5%8d%b0%e7%89%88%e7%ac%94%e8%ae%b0%e6%95%b4%e7%90%86/'></a></p><p><p>

----------Post from: <a href="http://liguoliang.com">@LiGuoliang.com, 欢迎回来~</a>----------</p></p>
]]></description>
			<content:encoded><![CDATA[<p>书很好, 层次清晰, 语言简练. 只是我英语太差, 读的稍稍有些吃力. 把自己理解的记录一下, 即便是错误的, 也先记录下来.</p>
<h3>1. Domain</h3>
<p>这个是最困惑我的一个词语.   <br />一般来讲, Domain指一个领域, 譬如Product, Student. 用户的需求一般为Domain, 用户需求中的名词多为Class, 用户需求的限制多为逻辑.</p>
<h3>2.Unit of Work</h3>
<p>Unit of Work有两个要素:    <br />1. 有多个Work</p>
<p>2. 多个Work同一个Transation, 全部成功或全部失败.</p>
<h3>3. Indentity Map</h3>
<p>将从DataBase中读取出来的对象放在一个Map中, 需要使用对象时, 先检查Map中是否存在, 不存在的情况下才去从DataBase读取.</p>
<h3>4. Qury Object</h3>
<p>用Object来代替SQL, EJB SQL语句, 可以增加Cache以及时间控制等</p>
<h3>5. MetaData Mapping</h3>
<p>Knowledge Level&#8217;s Knowledge Level.</p>
<p>例如, 一个Table中的某个Record 是一个 Operation Level, 则对应Column为该Record的Knowledge Level, 而该Column的属性描述,则为MetaData.</p>
<h3>6.Service Layer</h3>
<p>通过使用Service Layer来划分软件层次, 达到降低耦合的要求.</p>
<p>每个Layer不必提供过多服务, 而应当提供恰当的服务, 以降低开发,维护的复杂度. 类似与日常生活中组织机构的管理.一般来说,可以以此通过Project, Source Folder, Package, Class来划分Service Layer.</p>
<p>&#8230;..</p>
<p>这本书太高深了, 只能高山仰止了&#8230;</p>
<p><p>

----------Post from: <a href="http://liguoliang.com">@LiGuoliang.com, 欢迎回来~</a>----------</p></p>
]]></content:encoded>
			<wfw:commentRss>http://liguoliang.com/2008/%e4%bc%81%e4%b8%9a%e5%ba%94%e7%94%a8%e6%9e%b6%e6%9e%84%e6%a8%a1%e5%bc%8f%e5%bd%b1%e5%8d%b0%e7%89%88%e7%ac%94%e8%ae%b0%e6%95%b4%e7%90%86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex Singleton Pattern&#8212;-Flex中的单例模式</title>
		<link>http://liguoliang.com/2008/flex-singleton-pattern-flex%e4%b8%ad%e7%9a%84%e5%8d%95%e4%be%8b%e6%a8%a1%e5%bc%8f/</link>
		<comments>http://liguoliang.com/2008/flex-singleton-pattern-flex%e4%b8%ad%e7%9a%84%e5%8d%95%e4%be%8b%e6%a8%a1%e5%bc%8f/#comments</comments>
		<pubDate>Tue, 30 Sep 2008 16:49:22 +0000</pubDate>
		<dc:creator>Guoliang</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Singleton Pattern]]></category>
		<category><![CDATA[单例模式]]></category>
		<category><![CDATA[设计模式]]></category>

		<guid isPermaLink="false">http://liguoliang.com/?p=128</guid>
		<description><![CDATA[<p></p><p class='read-more'><a href='http://liguoliang.com/2008/flex-singleton-pattern-flex%e4%b8%ad%e7%9a%84%e5%8d%95%e4%be%8b%e6%a8%a1%e5%bc%8f/'>More...</a></p><p><p>

----------Post from: <a href="http://liguoliang.com">@LiGuoliang.com, 欢迎回来~</a>----------</p></p>
]]></description>
			<content:encoded><![CDATA[<p><span id="more-128"></span><br />
<h2>1. 概述</h2>
<p>Singleton Pattern的关键在于,只允许有一个对象存在.有时候我们需要有且只有一个对象存在,如播放器播放的歌曲, 购物车中的总额等.这些类对象只能有一个实例,如果制造出多个实例,就会导致很多问题.单例模式也给了我们一个全局的访问点,相对于全局变量来说, 单例模式采用的时lazy instantiaze,即在需要这个实例时才会创建.如果不需要这个实例,则永远不会产生.</p>
<p><!--more-->1.1   Singleton Pattern中有一个 private static 实例,它引用类的唯一的实例<br />
1.2  通过一个public  static method 来提供该实例的全局访问点. [如果为空则新创建一个]<br />
1.3   构造函数定义为Private或使用其他方法来阻止在外部使用new来创建实例</p>
<h2>2. 分析</h2>
<p>2.1 定义一个 Private static实例:private static var _instance:AppContext;<br />
2.2  定一个Public static function 提供全局访问点:</p>
<pre class="java" name="code">
public static function getInstance():AppContext {
if(!_instance) {
_instance = new AppContext(new PrivateClass);
}
return _instance;
}
</pre>
<p>2.3 相对与Java,Flex的构造函数必须为Public[因为ActionScript  3.0继承了当时的ECMAScript],而不能使用private,因此有可能通过new 来创建多个实例.<br />
我们需要在构造函数为Public的时候防止在类外使用new创建类的实例.<br />
OReilly.ActionScript.3.0.Design.Patterns中建议的方法:</p>
<blockquote><p><span style="text-decoration: line-through;">在这种情况下,我们将构造函数参数中加入一个该类所在.as文件中的非主类[ActionScript 3.0  中一个as文件可以包含多个类,与文件名相同的类为主类,其他叫非主类,非主类只能在包内使用.]</span></p>
<p><span style="text-decoration: line-through;">class PrivateClass {<br />
public function PrivateClass() {<br />
trace(&#8220;Private Class set up&#8221;);<br />
}<br />
}</span></p>
<p><span style="text-decoration: line-through;">构造函数写为: </span></p>
<p><span style="text-decoration: line-through;">public function AppContext(pvt:PrivateClass) {<br />
if(pvt ==  null) {<br />
throw new Error(&#8220;不用允许使用new来创建AppContex,请示使用getInstance&#8221;);<br />
}</span><br />
}</p></blockquote>
<p>但更为简洁的一个方法为:</p>
<p>public function AppContext() {<br />
if(_instance != null) {<br />
throw new Error(&#8220;Singleton!&#8221;);<br />
}<br />
}</p>
<h2>3. 代码</h2>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://www.riashanghai.com/zh-hant/node/58#">view  plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.riashanghai.com/zh-hant/node/58#">copy  to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://www.riashanghai.com/zh-hant/node/58#">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://www.riashanghai.com/zh-hant/node/58#">?</a></div>
</div>
<ol class="dp-j">
<li class="alt"><span><span class="keyword">package</span><span> com.insprise.notemanagement </span></span></li>
<li><span>{ </span></li>
<li class="alt"><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> AppContext </span></li>
<li><span>{ </span></li>
<li class="alt"><span> </span><span class="keyword">private</span><span> </span><span class="keyword">static</span><span> var _instance:AppContext; </span></li>
<li><span> </span></li>
<li class="alt"><span> </span><span class="keyword">private</span><span> var _currentUser:</span><span class="keyword">int</span><span>; </span></li>
<li><span> </span></li>
<li class="alt"><span> </span><span class="keyword">public</span><span> function AppContext() { </span></li>
<li><span> </span><span class="keyword">if</span><span>(_instance != </span><span class="keyword">null</span><span>) { </span></li>
<li class="alt"><span> </span><span class="keyword">throw</span><span> </span><span class="keyword">new</span><span> Error(</span><span class="string">&#8220;Singleton!&#8221;</span><span>); </span></li>
<li><span> } </span></li>
<li class="alt"><span> } </span></li>
<li><span> </span></li>
<li class="alt"><span> </span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> function getInstance():AppContext { </span></li>
<li><span> </span><span class="keyword">if</span><span>(_instance == </span><span class="keyword">null</span><span>) { </span></li>
<li class="alt"><span> _instance = </span><span class="keyword">new</span><span> AppContext(); </span></li>
<li><span> } </span></li>
<li class="alt"><span> </span><span class="keyword">return</span><span> _instance; </span></li>
<li><span> } </span></li>
<li class="alt"><span> </span></li>
<li><span> </span><span class="keyword">public</span><span> function get currentUser():</span><span class="keyword">int</span><span> { </span></li>
<li class="alt"><span> </span><span class="keyword">return</span><span> _currentUser; </span></li>
<li><span> } </span></li>
<li class="alt"><span> </span></li>
<li><span> </span><span class="keyword">public</span><span> function set currentUser(currentUser_:</span><span class="keyword">int</span><span>):</span><span class="keyword">void</span><span> { </span></li>
<li class="alt"><span> _currentUser = currentUser_; </span></li>
<li><span> } </span></li>
<li class="alt"><span> </span></li>
<li><span>}</span><span class="comment">//end of Class </span><span> </span></li>
<li class="alt"><span>}</span><span class="comment">//end fo package</span><span> </span></li>
</ol>
</div>
<pre class="java" style="display: none;">package com.insprise.notemanagement
{
public class AppContext
{
	private static var _instance:AppContext;

	private  var _currentUser:int; 

	public function AppContext() {
		if(_instance != null) {
			throw new Error("Singleton!");
		}
	}

	public static function getInstance():AppContext {
		if(_instance == null) {
			_instance = new AppContext();
		}
		return _instance;
	}

	public function get currentUser():int {
		return _currentUser;
	}

	public function set currentUser(currentUser_:int):void {
		_currentUser = currentUser_;
	}

}//end of Class
}//end fo package</pre>
<h2>4. 测试</h2>
<p>两次通过getInstance创建实例,判断是否为同一个.使用该实例的 set currentUser方法,set  currentUser,进一步确定两个实例是相同的.</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://www.riashanghai.com/zh-hant/node/58#">view  plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.riashanghai.com/zh-hant/node/58#">copy  to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://www.riashanghai.com/zh-hant/node/58#">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://www.riashanghai.com/zh-hant/node/58#">?</a></div>
</div>
<ol class="dp-j">
<li class="alt"><span><span class="keyword">import</span><span> com.insprise.notemanagement.AppContext; </span></span></li>
<li><span class="keyword">public</span><span> function singletonTest():</span><span class="keyword">void</span><span> { </span></li>
<li class="alt"><span> var firstSingleton:AppContext =  AppContext.getInstance(); </span></li>
<li><span> var secondeSingleton:AppContext = AppContext.getInstance(); </span></li>
<li class="alt"><span> trace(firstSingleton == secondeSingleton); </span></li>
<li><span> </span></li>
<li class="alt"><span> firstSingleton.currentUser = </span><span class="number">10</span><span>; </span></li>
<li><span> trace(</span><span class="string">&#8220;Get firstSingleton.CurrentUser: &#8221;</span><span> + firstSingleton.currentUser); </span></li>
<li class="alt"><span> trace(</span><span class="string">&#8220;Get secondSingleton.CurrentUser: &#8221;</span><span> + secondeSingleton.currentUser); </span></li>
<li><span> </span></li>
<li class="alt"><span> secondeSingleton.currentUser = </span><span class="number">20</span><span>; </span></li>
<li><span> trace(</span><span class="string">&#8220;Get firstSingleton.CurrentUser: &#8221;</span><span> + firstSingleton.currentUser); </span></li>
<li class="alt"><span> trace(</span><span class="string">&#8220;Get secondSingleton.CurrentUser: &#8221;</span><span> + secondeSingleton.currentUser); </span></li>
<li><span>} </span></li>
</ol>
</div>
<pre class="java" name="code">		import com.insprise.notemanagement.AppContext;
		public function singletonTest():void {
			var firstSingleton:AppContext =  AppContext.getInstance();
			var secondeSingleton:AppContext = AppContext.getInstance();
			trace(firstSingleton == secondeSingleton);

			firstSingleton.currentUser = 10;
			trace("Get firstSingleton.CurrentUser: " + firstSingleton.currentUser);
			trace("Get secondSingleton.CurrentUser: " + secondeSingleton.currentUser);

			secondeSingleton.currentUser = 20;
			trace("Get firstSingleton.CurrentUser: " + firstSingleton.currentUser);
			trace("Get secondSingleton.CurrentUser: " + secondeSingleton.currentUser);
		}</pre>
<p>测试结果:</p>
<p>Private Class set up</p>
<p>true</p>
<p>Get firstSingleton.CurrentUser: 10</p>
<p>Get secondSingleton.CurrentUser: 10</p>
<p>Get firstSingleton.CurrentUser: 20</p>
<p>Get secondSingleton.CurrentUser: 20</p>
<p><p>

----------Post from: <a href="http://liguoliang.com">@LiGuoliang.com, 欢迎回来~</a>----------</p></p>
]]></content:encoded>
			<wfw:commentRss>http://liguoliang.com/2008/flex-singleton-pattern-flex%e4%b8%ad%e7%9a%84%e5%8d%95%e4%be%8b%e6%a8%a1%e5%bc%8f/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

