﻿<?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>BlogJava-逝去的青春-随笔分类-java</title><link>http://www.blogjava.net/97030530/category/7965.html</link><description>勇往直前</description><language>zh-cn</language><lastBuildDate>Thu, 01 Mar 2007 15:35:25 GMT</lastBuildDate><pubDate>Thu, 01 Mar 2007 15:35:25 GMT</pubDate><ttl>60</ttl><item><title>回调函数在Spring中的使用</title><link>http://www.blogjava.net/97030530/archive/2006/03/30/38367.html</link><dc:creator>逝去的年华</dc:creator><author>逝去的年华</author><pubDate>Thu, 30 Mar 2006 13:57:00 GMT</pubDate><guid>http://www.blogjava.net/97030530/archive/2006/03/30/38367.html</guid><wfw:comment>http://www.blogjava.net/97030530/comments/38367.html</wfw:comment><comments>http://www.blogjava.net/97030530/archive/2006/03/30/38367.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/97030530/comments/commentRss/38367.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/97030530/services/trackbacks/38367.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Courier New" color="#0000ff">   这是一种对单个方法的参数使用控制反转，把控制权和差错处理交给框架来处理。严格的说，这是一种Strategy模式的特例，他们的区别就在于接口的复杂度不同。<br />   在Spring的JdbcTemplate中就使用了这种模式。JdbcTemplate实现了query()方法，参数是SQL字符串，和一个实现了回调接口的，将在读取resultSet每行时被调用。<br /></font>
		</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">interface</span>
				<span style="COLOR: #000000"> RowCallbackHandler <br /></span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_37_91_Open_Image" onclick="this.style.display='none'; Codehighlighter1_37_91_Open_Text.style.display='none'; Codehighlighter1_37_91_Closed_Image.style.display='inline'; Codehighlighter1_37_91_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_37_91_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_37_91_Closed_Text.style.display='none'; Codehighlighter1_37_91_Open_Image.style.display='inline'; Codehighlighter1_37_91_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_37_91_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_37_91_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080">3</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> processRow(ResultSet rs) </span>
						<span style="COLOR: #0000ff">throws</span>
						<span style="COLOR: #000000"> SQLException;<br /></span>
						<span style="COLOR: #008080">4</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000"> </span>
		</div>
		<p>
				<br />  query()方法封装了对JDBC底层API的调用。<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> query(String sql, RowCallbackHandler callbackHandler) </span>
				<span style="COLOR: #0000ff">throws</span>
				<span style="COLOR: #000000"> JdbcSqlException <br /><img id="Codehighlighter1_91_554_Open_Image" onclick="this.style.display='none'; Codehighlighter1_91_554_Open_Text.style.display='none'; Codehighlighter1_91_554_Closed_Image.style.display='inline'; Codehighlighter1_91_554_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_91_554_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_91_554_Closed_Text.style.display='none'; Codehighlighter1_91_554_Open_Image.style.display='inline'; Codehighlighter1_91_554_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_91_554_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_91_554_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    Connection con </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">null</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    PreparedStatement ps </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">null</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    ResultSet rs </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">null</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">try</span>
						<span style="COLOR: #000000"> <br /><img id="Codehighlighter1_176_365_Open_Image" onclick="this.style.display='none'; Codehighlighter1_176_365_Open_Text.style.display='none'; Codehighlighter1_176_365_Closed_Image.style.display='inline'; Codehighlighter1_176_365_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_176_365_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_176_365_Closed_Text.style.display='none'; Codehighlighter1_176_365_Open_Image.style.display='inline'; Codehighlighter1_176_365_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_176_365_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_176_365_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        con </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">&lt;</span>
								<span style="COLOR: #000000">code to get connection</span>
								<span style="COLOR: #000000">&gt;</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        ps </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> con.prepareStatement (sql);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        rs </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> ps.executeQuery();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">while</span>
								<span style="COLOR: #000000"> (rs.next()) <br /><img id="Codehighlighter1_295_334_Open_Image" onclick="this.style.display='none'; Codehighlighter1_295_334_Open_Text.style.display='none'; Codehighlighter1_295_334_Closed_Image.style.display='inline'; Codehighlighter1_295_334_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_295_334_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_295_334_Closed_Text.style.display='none'; Codehighlighter1_295_334_Open_Image.style.display='inline'; Codehighlighter1_295_334_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span id="Codehighlighter1_295_334_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_295_334_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            callbackHandler.processRow(rs);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        rs.close();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        ps.close();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">catch</span>
						<span style="COLOR: #000000"> (SQLException ex) <br /><img id="Codehighlighter1_395_468_Open_Image" onclick="this.style.display='none'; Codehighlighter1_395_468_Open_Text.style.display='none'; Codehighlighter1_395_468_Closed_Image.style.display='inline'; Codehighlighter1_395_468_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_395_468_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_395_468_Closed_Text.style.display='none'; Codehighlighter1_395_468_Open_Image.style.display='inline'; Codehighlighter1_395_468_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_395_468_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_395_468_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">throw</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> JdbcSqlException(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">Couldn't run query [</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000"> sql </span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">]</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">, ex);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">finally</span>
						<span style="COLOR: #000000"> <br /><img id="Codehighlighter1_481_552_Open_Image" onclick="this.style.display='none'; Codehighlighter1_481_552_Open_Text.style.display='none'; Codehighlighter1_481_552_Closed_Image.style.display='inline'; Codehighlighter1_481_552_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_481_552_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_481_552_Closed_Text.style.display='none'; Codehighlighter1_481_552_Open_Image.style.display='inline'; Codehighlighter1_481_552_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_481_552_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_481_552_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        DataSourceUtils.closeConnectionIfNecessary(</span>
								<span style="COLOR: #0000ff">this</span>
								<span style="COLOR: #000000">.dataSource, con);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
		<p>
				<br />   在上面的例子中，JdbcSqlException继承了java.lang.RuntimeException，也就是说调用者可以选择去捕获它，但是这不是必须的。假如实现了回调接口的子类里的方法出错，而且不是RuntimeException的子类，也就是必须捕获的异常，但是query()方法中在逻辑上是没有办法捕获它的。所以Rod_Johnson把接口定义成JdbcTemplate的inner interface。这就可以JdbcTemplate就可以捕获它。<br />   回调方法也是框架的一种基本方法，比如java.io.File类中的listFiles(FilenameFilter filter),FilenameFilter就是一个接口，我们实现这个接口中的方法accept(File dir, String name) ，这就是一个典型的回调方法。<br /><font face="Courier New" color="#0000ff">   观察者模式的使用符合开闭原则，并且分离了关注点。这种对模块修改开发，影响关闭的原则促进了AOP面向方面编程的发展。Spring中的AOP可能就是这种思想的实现，个人猜测而已。    <br />    把方法的参数放在一个类中，这样以后要增加参数的话，不用修改方法签名，感觉很干净，唯一可能的缺点是可能对性能有所下降，不过很小。如果没有用EJB的话，应该差不多。<br /><br />   对异常的处理，分为checked和unchecked异常，checked异常是继承java.lang.Exception的。Unchecked异常继承java.lang.RuntimeException。Rod_Johnson主张在对出现异常后，程序不能处理，只能给予没用的提示时用RuntimeException，因为RuntimeException容器会自动处理。关于异常的详细说明，我也没看明白，希望那位大虾能指点指点。</font></p>
		<p>
				<font face="Courier New" color="#0000ff">备注：本文主要内容来源于Rod_Johnson的大作，强烈建议看原版！<br /></font>
		</p>
<img src ="http://www.blogjava.net/97030530/aggbug/38367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/97030530/" target="_blank">逝去的年华</a> 2006-03-30 21:57 <a href="http://www.blogjava.net/97030530/archive/2006/03/30/38367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Template模式和Strategey模式</title><link>http://www.blogjava.net/97030530/archive/2006/03/29/38131.html</link><dc:creator>逝去的年华</dc:creator><author>逝去的年华</author><pubDate>Wed, 29 Mar 2006 12:49:00 GMT</pubDate><guid>http://www.blogjava.net/97030530/archive/2006/03/29/38131.html</guid><wfw:comment>http://www.blogjava.net/97030530/comments/38131.html</wfw:comment><comments>http://www.blogjava.net/97030530/archive/2006/03/29/38131.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/97030530/comments/commentRss/38131.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/97030530/services/trackbacks/38131.html</trackback:ping><description><![CDATA[
		<p>         <font color="#0000ff"><font face="Courier New">在学习Spring的过程中经常看到一些大虾推荐阅读Rod_Johnson的&lt;Expert_One-on-One_J2EE_Design_and_Development&gt;书,据说此书的第四章每个学java人都要看看.好不容易搞到pdf版,可惜是E文的,中文的搞不到,没办法只好硬着头皮看下去。<br />   第四章主要讲的是面向对象的设计模式,怎么采用一致的编码公约,怎么利用也有的系统.这对于理解Spring框架有很大的帮助!因为这是Spring之父的编程思想。):<br />   关于接口的好处及组合模式的有点,我这里就不说了。<br />   Template模式:适用范围,我们知道某个业务或算法的步骤,但是不知道怎么把每步的顺序。Template模式采用在abstract类中有个Public and final的方法封装了调用每步的顺序,也就是说控制了工作流程。所有的继承类也就只要实现每步的具体方法。这是控制反转的一种表现，以前都是我们在程序中去调用API中的方法,现在是我们实现API某个类中的抽象方法给该类调用!这种控制反转的机制,是框架的代码基础.比如,EJB中的Init()和destory()方法等等.Spring框架中的对数据持久层的实现就是很好的例子!<br />下面把书中的例子COPY下:<br />  AbstractOrderEJB父类实现了商业逻辑,包括用户是否金额超现和对大的订单进行打折,palceOrder()方法就是那个工作流方法。</font><br /></font></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">abstract</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> AbstractOrderEJB<br /><img id="Codehighlighter1_32_856_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_856_Open_Text.style.display='none'; Codehighlighter1_32_856_Closed_Image.style.display='inline'; Codehighlighter1_32_856_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_32_856_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_32_856_Closed_Text.style.display='none'; Codehighlighter1_32_856_Open_Image.style.display='inline'; Codehighlighter1_32_856_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_32_856_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_32_856_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">final</span>
						<span style="COLOR: #000000"> Invoice placeOrder (</span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> customerId, InvoiceItem[] items)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
						<span style="COLOR: #0000ff">throws</span>
						<span style="COLOR: #000000"> NoSuchCustomerException, SpendingLimitViolation <br /><img id="Codehighlighter1_164_626_Open_Image" onclick="this.style.display='none'; Codehighlighter1_164_626_Open_Text.style.display='none'; Codehighlighter1_164_626_Closed_Image.style.display='inline'; Codehighlighter1_164_626_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_164_626_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_164_626_Closed_Text.style.display='none'; Codehighlighter1_164_626_Open_Image.style.display='inline'; Codehighlighter1_164_626_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_164_626_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_164_626_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000"> total </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">for</span>
								<span style="COLOR: #000000"> (</span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000"> i </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">; i </span>
								<span style="COLOR: #000000">&lt;</span>
								<span style="COLOR: #000000"> items. length; i</span>
								<span style="COLOR: #000000">++</span>
								<span style="COLOR: #000000">) <br /><img id="Codehighlighter1_228_297_Open_Image" onclick="this.style.display='none'; Codehighlighter1_228_297_Open_Text.style.display='none'; Codehighlighter1_228_297_Closed_Image.style.display='inline'; Codehighlighter1_228_297_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_228_297_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_228_297_Closed_Text.style.display='none'; Codehighlighter1_228_297_Open_Image.style.display='inline'; Codehighlighter1_228_297_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span id="Codehighlighter1_228_297_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_228_297_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            total </span>
										<span style="COLOR: #000000">+=</span>
										<span style="COLOR: #000000"> getItemPrice (items [i]) </span>
										<span style="COLOR: #000000">*</span>
										<span style="COLOR: #000000"> items [i] .getQuantity();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (total </span>
								<span style="COLOR: #000000">&gt;</span>
								<span style="COLOR: #000000"> getSpendingLimit (customerId) )<br /><img id="Codehighlighter1_347_446_Open_Image" onclick="this.style.display='none'; Codehighlighter1_347_446_Open_Text.style.display='none'; Codehighlighter1_347_446_Closed_Image.style.display='inline'; Codehighlighter1_347_446_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_347_446_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_347_446_Closed_Text.style.display='none'; Codehighlighter1_347_446_Open_Image.style.display='inline'; Codehighlighter1_347_446_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span id="Codehighlighter1_347_446_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_347_446_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            getSessionContext() .setRollbackOnly();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
										<span style="COLOR: #0000ff">throw</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">new</span>
										<span style="COLOR: #000000"> SpendingLimitViolation (total, limit);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (total </span>
								<span style="COLOR: #000000">&gt;</span>
								<span style="COLOR: #000000"> DISCOUNT_THRESHOLD) <br /><img id="Codehighlighter1_490_527_Open_Image" onclick="this.style.display='none'; Codehighlighter1_490_527_Open_Text.style.display='none'; Codehighlighter1_490_527_Closed_Image.style.display='inline'; Codehighlighter1_490_527_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_490_527_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_490_527_Closed_Text.style.display='none'; Codehighlighter1_490_527_Open_Image.style.display='inline'; Codehighlighter1_490_527_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span id="Codehighlighter1_490_527_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_490_527_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000"> Apply discount to total<img src="http://www.blogjava.net/images/dot.gif" /></span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />
										</span>
										<span style="COLOR: #000000">        }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000"> invoiceId </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> placeOrder (customerId, total, items);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> InvoiceImpl (iid, total);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">protected</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">abstract</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> getItemPrice(InvoiceItem item);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">protected</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">abstract</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> getSpendingLimit(customerId)</span>
						<span style="COLOR: #0000ff">throws</span>
						<span style="COLOR: #000000"> NoSuchCustomerException;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">protected</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">abstract</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> placeOrder(</span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> customerId, </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> total,InvoiceItem[] items);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />  }</span>
				</span>
		</div>
		<p>
				<font face="Courier New">   <font color="#0000ff">getItemPrice，getSpendingLimit，placeOrder这三个方法，是protected and abstract的，由子类来实现。</font><br /><font color="#0000ff">   Strategey模式和Template模式比较相似.用Strategey模式对上个例子进行改造:把三个单独的方法放入一个接口中,工作流方法进行如下修改:</font></font>
				<br />
		</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> OrderEJB<br /></span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_22_791_Open_Image" onclick="this.style.display='none'; Codehighlighter1_22_791_Open_Text.style.display='none'; Codehighlighter1_22_791_Closed_Image.style.display='inline'; Codehighlighter1_22_791_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_22_791_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_22_791_Closed_Text.style.display='none'; Codehighlighter1_22_791_Open_Image.style.display='inline'; Codehighlighter1_22_791_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_22_791_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_22_791_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080"> 3</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> DataHelper dataHelper;<br /></span>
						<span style="COLOR: #008080"> 4</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> setDataHelper (DataHelper newDataHelper) <br /></span>
						<span style="COLOR: #008080"> 5</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_112_150_Open_Image" onclick="this.style.display='none'; Codehighlighter1_112_150_Open_Text.style.display='none'; Codehighlighter1_112_150_Closed_Image.style.display='inline'; Codehighlighter1_112_150_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_112_150_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_112_150_Closed_Text.style.display='none'; Codehighlighter1_112_150_Open_Image.style.display='inline'; Codehighlighter1_112_150_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_112_150_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_112_150_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080"> 6</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">this</span>
								<span style="COLOR: #000000">.dataHelper </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> newDataHelper;<br /></span>
								<span style="COLOR: #008080"> 7</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080"> 8</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">final</span>
						<span style="COLOR: #000000"> Invoice placeOrder (</span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> customerId, InvoiceItem[] items)<br /></span>
						<span style="COLOR: #008080"> 9</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
						<span style="COLOR: #0000ff">throws</span>
						<span style="COLOR: #000000"> NoSuchCustomerException, SpendingLimitViolation <br /></span>
						<span style="COLOR: #008080">10</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_282_789_Open_Image" onclick="this.style.display='none'; Codehighlighter1_282_789_Open_Text.style.display='none'; Codehighlighter1_282_789_Closed_Image.style.display='inline'; Codehighlighter1_282_789_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_282_789_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_282_789_Closed_Text.style.display='none'; Codehighlighter1_282_789_Open_Image.style.display='inline'; Codehighlighter1_282_789_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_282_789_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_282_789_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">11</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000"> total </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">;<br /></span>
								<span style="COLOR: #008080">12</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">for</span>
								<span style="COLOR: #000000"> (</span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000"> i </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">; i </span>
								<span style="COLOR: #000000">&lt;</span>
								<span style="COLOR: #000000"> items.length; i</span>
								<span style="COLOR: #000000">++</span>
								<span style="COLOR: #000000">) <br /></span>
								<span style="COLOR: #008080">13</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_345_429_Open_Image" onclick="this.style.display='none'; Codehighlighter1_345_429_Open_Text.style.display='none'; Codehighlighter1_345_429_Closed_Image.style.display='inline'; Codehighlighter1_345_429_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_345_429_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_345_429_Closed_Text.style.display='none'; Codehighlighter1_345_429_Open_Image.style.display='inline'; Codehighlighter1_345_429_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span id="Codehighlighter1_345_429_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_345_429_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080">14</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            total </span>
										<span style="COLOR: #000000">+=</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">this</span>
										<span style="COLOR: #000000">.dataHelper.getItemPrice(items[i]) </span>
										<span style="COLOR: #000000">*</span>
										<span style="COLOR: #000000">
												<br />
										</span>
										<span style="COLOR: #008080">15</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            items[i].getQuantity();<br /></span>
										<span style="COLOR: #008080">16</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
								</span>
								<span style="COLOR: #008080">17</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (total </span>
								<span style="COLOR: #000000">&gt;</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">this</span>
								<span style="COLOR: #000000">.dataHelper.getSpendingLimit(customerId)) <br /></span>
								<span style="COLOR: #008080">18</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_494_592_Open_Image" onclick="this.style.display='none'; Codehighlighter1_494_592_Open_Text.style.display='none'; Codehighlighter1_494_592_Closed_Image.style.display='inline'; Codehighlighter1_494_592_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_494_592_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_494_592_Closed_Text.style.display='none'; Codehighlighter1_494_592_Open_Image.style.display='inline'; Codehighlighter1_494_592_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span id="Codehighlighter1_494_592_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_494_592_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080">19</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            getSessionContext() .setRollbackOnly();<br /></span>
										<span style="COLOR: #008080">20</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
										<span style="COLOR: #0000ff">throw</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">new</span>
										<span style="COLOR: #000000"> SpendingLimitViolation(total, limit);<br /></span>
										<span style="COLOR: #008080">21</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000"> <br /></span>
								<span style="COLOR: #008080">22</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (total </span>
								<span style="COLOR: #000000">&gt;</span>
								<span style="COLOR: #000000"> DISCOUNT_THRESHOLD) <br /></span>
								<span style="COLOR: #008080">23</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_637_674_Open_Image" onclick="this.style.display='none'; Codehighlighter1_637_674_Open_Text.style.display='none'; Codehighlighter1_637_674_Closed_Image.style.display='inline'; Codehighlighter1_637_674_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_637_674_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_637_674_Closed_Text.style.display='none'; Codehighlighter1_637_674_Open_Image.style.display='inline'; Codehighlighter1_637_674_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span id="Codehighlighter1_637_674_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_637_674_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080">24</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000"> Apply discount to total<img src="http://www.blogjava.net/images/dot.gif" /></span>
										<span style="COLOR: #008000">
												<br />
										</span>
										<span style="COLOR: #008080">25</span>
										<span style="COLOR: #008000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />
										</span>
										<span style="COLOR: #000000">        }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
								</span>
								<span style="COLOR: #008080">26</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000"> invoiceId </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">this</span>
								<span style="COLOR: #000000">.dataHelper.placeOrder (customerId, total, items);<br /></span>
								<span style="COLOR: #008080">27</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> InvoiceImpl (iid, total);<br /></span>
								<span style="COLOR: #008080">28</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">29</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
		<p>
				<font face="Courier New" color="#0000ff">   Stratery模式比Temlater模式复杂点，但是它具有更高的灵活性，对于实际项目一些流程的控制有很好的作用！这是本人的观点，不一定正确，仅供参考。<br />   <br />在下面的情况下,用Stratery模式比Temlater模式更好:<br />1,每步都是可变的<br />2,实现每步的类需要一个独立的继承体系<br />3,实现每步的类要和其他的类打交道<br />4,实现每步的类要实现多态性<br /><br />备注：本文主要内容来源于Rod_Johnson的大作，强烈建议看原版！</font>
		</p>
<img src ="http://www.blogjava.net/97030530/aggbug/38131.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/97030530/" target="_blank">逝去的年华</a> 2006-03-29 20:49 <a href="http://www.blogjava.net/97030530/archive/2006/03/29/38131.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>