﻿<?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-敬的世界-随笔分类-框架</title><link>http://www.blogjava.net/nikita/category/39099.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 23 May 2009 23:00:36 GMT</lastBuildDate><pubDate>Sat, 23 May 2009 23:00:36 GMT</pubDate><ttl>60</ttl><item><title>设计模式之Observer - Java设计模式</title><link>http://www.blogjava.net/nikita/archive/2008/10/08/233193.html</link><dc:creator>picture talk</dc:creator><author>picture talk</author><pubDate>Wed, 08 Oct 2008 10:06:00 GMT</pubDate><guid>http://www.blogjava.net/nikita/archive/2008/10/08/233193.html</guid><wfw:comment>http://www.blogjava.net/nikita/comments/233193.html</wfw:comment><comments>http://www.blogjava.net/nikita/archive/2008/10/08/233193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nikita/comments/commentRss/233193.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nikita/services/trackbacks/233193.html</trackback:ping><description><![CDATA[
		<p>
				<span lang="EN-US">Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Observer(观察者)模式是比较常用的一个模式,尤其在界面设计中应用广泛,而本站所关注的是Java在电子商务系统中应用,因此想从电子商务实例中分析Observer的应用.<?XML:NAMESPACE PREFIX = O /?><o:p></o:p></span>
		</p>
		<p>虽然网上商店形式多样<span lang="EN-US">,每个站点有自己的特色,但也有其一般的共性,单就"商品的变化,以便及时通知订户"这一点,是很多网上商店共有的模式,这一模式类似Observer patern.<o:p></o:p></span></p>
		<p>具体的说<span lang="EN-US">,如果网上商店中商品在名称 价格等方面有变化,如果系统能自动通知会员,将是网上商店区别传统商店的一大特色.这就需要在商品product中加入Observer这样角色,以便product细节发生变化时,Observer能自动观察到这种变化,并能进行及时的update或notify动作.<o:p></o:p></span></p>
		<p>
				<span lang="EN-US">
						<img id="_x0000_i1089" height="323" src="http://book.javanb.com/java-design-patterns/设计模式之Observer.files/observer1.jpg" width="443" />
						<o:p>
						</o:p>
				</span>
		</p>
		<p>
				<span lang="EN-US">Java的API还为为我们提供现成的Observer接口Java.util.Observer.我们只要直接使用它就可以.<o:p></o:p></span>
		</p>
		<p>我们必须<span lang="EN-US">extends Java.util.Observer才能真正使用它:<br />1.提供Add/Delete observer的方法;<br />2.提供通知(notisfy) 所有observer的方法;<o:p></o:p></span></p>
		<table style="BACKGROUND: #cccccc; WIDTH: 80%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="80%" bgcolor="#cccccc" border="0">
				<tbody>
						<tr>
								<td style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; PADDING-TOP: 2.25pt">
										<p class="MsoNormal">
												<span lang="EN-US" style="FONT-SIZE: 10.5pt">//产品类 可供Jsp直接使用UseBean调用 该类主要执行产品数据库插入 更新<br />public class product extends Observable{ <o:p></o:p></span>
										</p>
										<p>　　<span lang="EN-US">private String name;<br />　　private float price;<o:p></o:p></span></p>
										<p>　　<span lang="EN-US">public String getName(){ return name;}<br />　　public void setName(){<br />　　 this.name=name;<br />　　//设置变化点 <br />　　 setChanged();<br />　　 notifyObservers(name);<o:p></o:p></span></p>
										<p>　　<span lang="EN-US">}　　　<o:p></o:p></span></p>
										<p>　　<span lang="EN-US">public float getPrice(){ return price;}<br />　　public void setPrice(){<br />　　 this.price=price;<br />　　//设置变化点<br />　　 setChanged();<br />　　 notifyObservers(new Float(price)); <o:p></o:p></span></p>
										<p>　　<span lang="EN-US">}<br /><br />　　//以下可以是数据库更新 插入命令.<br />　　public void saveToDb(){<br />　　.....................<o:p></o:p></span></p>
										<p>
												<span lang="EN-US">}<o:p></o:p></span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<span lang="EN-US">
						<br />我们注意到,在product类中 的setXXX方法中,我们设置了 notify(通知)方法, 当Jsp表单调用setXXX(如何调用见我的<a href="http://www.jdon.com/designpatterns/Êý¾Ý¿âbean.htm" target="_blank"><font color="#776655">另外一篇文章</font></a>),实际上就触发了notisfyObservers方法,这将通知相应观察者应该采取行动了.<o:p></o:p></span>
		</p>
		<p>下面看看这些观察者的代码<span lang="EN-US">,他们究竟采取了什么行动:<o:p></o:p></span></p>
		<table style="WIDTH: 99%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="99%" border="0">
				<tbody>
						<tr>
								<td style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 2.25pt; PADDING-TOP: 2.25pt">
										<p>
												<span lang="EN-US">//观察者NameObserver主要用来对产品名称(name)进行观察的<br />public class NameObserver implements Observer{<o:p></o:p></span>
										</p>
										<p>　　<span lang="EN-US">private String name=null;<o:p></o:p></span></p>
										<p>　　<span lang="EN-US">public void update(Observable obj,Object arg){<br /><br />　　　　if (arg <a href="http://www-900.ibm.com/developerWorks/java/l-leditor/index.shtml" target="_blank"><font color="#776655">instanceof</font></a> String){<o:p></o:p></span></p>
										<p>　　　　<span lang="EN-US"> name=(String)arg;<br />　　　　 //产品名称改变值在name中<br />　　　　 System.out.println("NameObserver :name changet to "+name);<o:p></o:p></span></p>
										<p>　　　　<span lang="EN-US">}<o:p></o:p></span></p>
										<p>　　<span lang="EN-US">}<o:p></o:p></span></p>
										<p>
												<span lang="EN-US">}<o:p></o:p></span>
										</p>
										<p>
												<span lang="EN-US">//观察者PriceObserver主要用来对产品价格(price)进行观察的<br />public class PriceObserver implements Observer{<o:p></o:p></span>
										</p>
										<p>　　<span lang="EN-US">private float price=0;<o:p></o:p></span></p>
										<p>　　<span lang="EN-US">public void update(Observable obj,Object arg){<br /><br />　　　　if (arg instanceof Float){<o:p></o:p></span></p>
										<p>　　　　<span lang="EN-US"> price=((Float)arg).floatValue();<br />　　<br />　　　　 System.out.println("PriceObserver :price changet to "+price);<o:p></o:p></span></p>
										<p>　　　　<span lang="EN-US">}<o:p></o:p></span></p>
										<p>　　<span lang="EN-US">}<o:p></o:p></span></p>
										<p>
												<span lang="EN-US">}<o:p></o:p></span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<span lang="EN-US">
						<br />Jsp中我们可以来正式执行这段观察者程序:<o:p></o:p></span>
		</p>
		<table style="WIDTH: 96%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="96%" border="0">
				<tbody>
						<tr>
								<td style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 2.25pt; PADDING-TOP: 2.25pt">
										<p>
												<b>
														<span lang="EN-US">&lt;jsp:useBean id="product" scope="session" class="Product" /&gt;<br />&lt;jsp:setProperty name="product" property="*" /&gt;</span>
												</b>
												<span lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
										<p>
												<b>
														<span lang="EN-US">&lt;jsp:useBean id="nameobs" scope="session" class="NameObserver" /&gt;<br />&lt;jsp:setProperty name="product" property="*" /&gt;</span>
												</b>
												<span lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
										<p>
												<b>
														<span lang="EN-US">&lt;jsp:useBean id="priceobs" scope="session" class="PriceObserver" /&gt;<br />&lt;jsp:setProperty name="product" property="*" /&gt;</span>
												</b>
												<span lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
										<p>
												<span lang="EN-US">&lt;%<br /><br />if (request.getParameter("save")!=null)<br />{ <br />　　product.saveToDb();<br /><br /><br />　　out.println("产品数据变动 保存! 并已经自动通知客户"); <o:p></o:p></span>
										</p>
										<p>
												<span lang="EN-US">}else{<br /><br />　　//加入观察者<br />　　product.addObserver(<b>nameobs</b>);<br /><br />　　product.addObserver(<b>priceobs</b>);<o:p></o:p></span>
										</p>
										<p>
												<span lang="EN-US">%&gt;<o:p></o:p></span>
										</p>
										<p>　　<span lang="EN-US">//request.getRequestURI()是产生本jsp的程序名,就是自己调用自己<br />　　&lt;form action="&lt;%=request.getRequestURI()%&gt;" method=post&gt;<o:p></o:p></span></p>
										<p>　　<span lang="EN-US">&lt;input type=hidden name="save" value="1"&gt;<br />　　产品名称:&lt;input type=text name="name" &gt;<br />　　产品价格:&lt;input type=text name="price"&gt;<br />　　&lt;input type=submit&gt;<o:p></o:p></span></p>
										<p>　　<span lang="EN-US">&lt;/form&gt;<o:p></o:p></span></p>
										<p>
												<span lang="EN-US">&lt;%<br /><br />} <o:p></o:p></span>
										</p>
										<p>
												<span lang="EN-US">%&gt;<o:p></o:p></span>
										</p>
										<p>
												<span lang="EN-US"> <o:p></o:p></span>
										</p>
										<p>
												<span lang="EN-US"> <o:p></o:p></span>
										</p>
										<p>
												<span lang="EN-US"> <o:p></o:p></span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>执行改<span lang="EN-US">Jsp程序,会出现一个表单录入界面, 需要输入产品名称 产品价格, 点按Submit后,还是执行该jsp的<br />if (request.getParameter("save")!=null)之间的代码.<br /><br /><br />由于这里使用了数据javabeans的自动赋值概念,实际程序自动执行了setName setPrice语句.你会在服务器控制台中发现下面信息::<br /><b><br />NameObserver :name changet to ?????(Jsp表单中输入的产品名称)<br /><br />PriceObserver :price changet to ???(Jsp表单中输入的产品价格);</b><o:p></o:p></span></p>
		<p style="MARGIN-BOTTOM: 12pt">这说明观察者已经在行动了<span lang="EN-US">.!!<br />同时你会在执行jsp的浏览器端得到信息:<br /><br /><b>产品数据变动 保存! 并已经自动通知客户</b><o:p></o:p></span></p>
		<p>上文由于使用<span lang="EN-US">jsp概念,隐含很多自动动作,现将调用观察者的Java代码写如下:<o:p></o:p></span></p>
		<table style="BACKGROUND: #cccccc; WIDTH: 80%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="80%" bgcolor="#cccccc" border="0">
				<tbody>
						<tr>
								<td style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; PADDING-TOP: 2.25pt">
										<p>
												<span lang="EN-US"> <o:p></o:p></span>
										</p>
										<p>
												<span lang="EN-US">public class Test {<o:p></o:p></span>
										</p>
										<p>　　<span lang="EN-US">public static void main(String args[]){<o:p></o:p></span></p>
										<p>
												<span lang="EN-US">Product product=new Product();<br /><br />NameObserver nameobs=new NameObserver();<br />PriceObserver priceobs=new PriceObserver();<o:p></o:p></span>
										</p>
										<p>
												<span lang="EN-US">//加入观察者<br />product.addObserver(nameobs);<br />product.addObserver(priceobs);<o:p></o:p></span>
										</p>
										<p>
												<span lang="EN-US">product.setName("橘子红了");<br />product.setPrice(9.22f); <o:p></o:p></span>
										</p>
										<p>　　<span lang="EN-US">}<o:p></o:p></span></p>
										<p>
												<span lang="EN-US">}<o:p></o:p></span>
										</p>
										<p>
												<span lang="EN-US"> <o:p></o:p></span>
										</p>
										<p>
												<span lang="EN-US"> <o:p></o:p></span>
										</p>
										<p>
												<span lang="EN-US"> <o:p></o:p></span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>你会在发现下面信息<span lang="EN-US">::<br /><b><br />NameObserver :name changet to 橘子红了<br /><br />PriceObserver :price changet to 9.22</b><o:p></o:p></span></p>
		<p>这说明观察者在行动了<span lang="EN-US">.!!<br /><o:p><br />来源 ： <a href="http://book.javanb.com/java-design-patterns/Observer.html">http://book.javanb.com/java-design-patterns/Observer.html</a></o:p></span></p>
<img src ="http://www.blogjava.net/nikita/aggbug/233193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nikita/" target="_blank">picture talk</a> 2008-10-08 18:06 <a href="http://www.blogjava.net/nikita/archive/2008/10/08/233193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式之Composite - Java设计模式</title><link>http://www.blogjava.net/nikita/archive/2008/10/08/233172.html</link><dc:creator>picture talk</dc:creator><author>picture talk</author><pubDate>Wed, 08 Oct 2008 08:53:00 GMT</pubDate><guid>http://www.blogjava.net/nikita/archive/2008/10/08/233172.html</guid><wfw:comment>http://www.blogjava.net/nikita/comments/233172.html</wfw:comment><comments>http://www.blogjava.net/nikita/archive/2008/10/08/233172.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nikita/comments/commentRss/233172.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nikita/services/trackbacks/233172.html</trackback:ping><description><![CDATA[
		<p>
				<b>
						<span lang="EN-US">Composite定义</span>
				</b>
				<span lang="EN-US">:<br />将对象以树形结构组织起来,以达成“部分－整体” 的层次结构，使得客户端对单个对象和组合对象的使用具有一致性.<?XML:NAMESPACE PREFIX = O /?><o:p></o:p></span>
		</p>
		<p>
				<span lang="EN-US">Composite比较容易理解，想到Composite就应该想到树形结构图。组合体内这些对象都有共同接口,当组合体一个对象的方法被调用执行时，Composite将遍历(Iterator)整个树形结构,寻找同样包含这个方法的对象并实现调用执行。可以用牵一动百来形容。<o:p></o:p></span>
		</p>
		<p>所以<span lang="EN-US">Composite模式使用到Iterator模式，和Chain of Responsibility模式类似。<o:p></o:p></span></p>
		<p>
				<b>
						<span lang="EN-US">Composite好处</span>
				</b>
				<span lang="EN-US">:<br />1.使客户端调用简单，客户端可以一致的使用组合结构或其中单个对象，用户就不必关系自己处理的是单个对象还是整个组合结构，这就简化了客户端代码。<br />2.更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。<o:p></o:p></span>
		</p>
		<p>
				<b>如何使用<span lang="EN-US">Composite?</span></b>
				<span lang="EN-US">
						<br />首先定义一个接口或抽象类，这是设计模式通用方式了，其他设计模式对接口内部定义限制不多，Composite却有个规定，那就是要在接口内部定义一个用于访问和管理Composite组合体的对象们（或称部件Component）.<o:p></o:p></span>
		</p>
		<p>下面的代码是以抽象类定义，一般尽量用接口<span lang="EN-US">interface,<o:p></o:p></span></p>
		<table style="WIDTH: 80%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="80%" border="0">
				<tbody>
						<tr>
								<td style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 2.25pt; PADDING-TOP: 2.25pt">
										<p class="MsoNormal">
												<span lang="EN-US" style="FONT-SIZE: 10.5pt">public abstract class Equipment<br />{<br />　　private String name; <br />　　//网络价格<br />　　public abstract double netPrice();<br />　　//折扣价格<br />　　public abstract double discountPrice();<br />　　//增加部件方法　　<br />　　public boolean add(Equipment equipment) { return false; }<br />　　//删除部件方法<br />　　public boolean remove(Equipment equipment) { return false; }<br />　　//注意这里，这里就提供一种用于访问组合体类的部件方法。<br />　　public Iterator iter() { return null; }<br />　　<br />　　public Equipment(final String name) { this.name=name; }<br />} <o:p></o:p></span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>抽象类<span lang="EN-US">Equipment就是Component定义，代表着组合体类的对象们,Equipment中定义几个共同的方法。<o:p></o:p></span></p>
		<table style="WIDTH: 80%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="80%" border="0">
				<tbody>
						<tr>
								<td style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 2.25pt; PADDING-TOP: 2.25pt">
										<p class="MsoNormal">
												<span lang="EN-US" style="FONT-SIZE: 10.5pt">public class Disk extends Equipment<br />{<br />　　public Disk(String name) { super(name); }<br />　　//定义Disk网络价格为1<br />　　public double netPrice() { return 1.; }<br />　　//定义了disk折扣价格是0.5 对折。<br />　　public double discountPrice() { return .5; }<br />}<o:p></o:p></span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<span lang="EN-US">Disk是组合体内的一个对象，或称一个部件，这个部件是个单独元素( Primitive)。<br />还有一种可能是，一个部件也是一个组合体，就是说这个部件下面还有'儿子'，这是树形结构中通常的情况，应该比较容易理解。现在我们先要定义这个组合体：<o:p></o:p></span>
		</p>
		<table style="WIDTH: 80%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="80%" border="0">
				<tbody>
						<tr>
								<td style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 2.25pt; PADDING-TOP: 2.25pt">
										<p>
												<span lang="EN-US">abstract class CompositeEquipment extends Equipment<br />{<br />　　private int i=0; <br />　　//定义一个Vector 用来存放'儿子'<br />　　private Lsit equipment=new ArrayList();<br /><br />　　public CompositeEquipment(String name) { super(name); }<br /><br />　　public boolean add(Equipment equipment) { <br />　　　　 this.equipment.add(equipment); <br />　　　　 return true; <br />　　 }<br /><br />　　public double netPrice() <br />　　{<br />　　　　double netPrice=0.;<br />　　　　Iterator iter=equipment.iterator();<br />　　　　for(iter.hasNext())<br />　　　　　　netPrice+=((Equipment)iter.next()).netPrice();<br />　　　　return netPrice;<br />　　}<br /><br />　　public double discountPrice() <br />　　{<br />　　　　double discountPrice=0.;<br />　　　　Iterator iter=equipment.iterator();<br />　　　　for(iter.hasNext())<br />　　　　　　discountPrice+=((Equipment)iter.next()).discountPrice();<br />　　　　return discountPrice;<br />　　}<br />　　<o:p></o:p></span>
										</p>
										<p>　　<span lang="EN-US">//注意这里，这里就提供用于访问自己组合体内的部件方法。<br />　　//上面dIsk 之所以没有，是因为Disk是个单独(Primitive)的元素.<br />　　public Iterator iter()<br />　　{<br />　　　　return equipment.iterator() ;<br />　　{<br />　　//重载Iterator方法<br />　　 public boolean hasNext() { return i&lt;equipment.size(); }<br />　　//重载Iterator方法<br />　　 public Object next()<br />　　 {<br />　　　　if(hasNext())<br />　　　　　　 return equipment.elementAt(i++);<br />　　　　else <br />　　 　　 　 throw new NoSuchElementException();<br />　　 }<br />　　<br /><br />}<o:p></o:p></span></p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>上面<span lang="EN-US">CompositeEquipment继承了Equipment,同时为自己里面的对象们提供了外部访问的方法,重载了Iterator,Iterator是Java的Collection的一个接口，是Iterator模式的实现.<o:p></o:p></span></p>
		<p>我们再看看<span lang="EN-US">CompositeEquipment的两个具体类:盘盒Chassis和箱子Cabinet，箱子里面可以放很多东西，如底板，电源盒，硬盘盒等；盘盒里面可以放一些小设备，如硬盘 软驱等。无疑这两个都是属于组合体性质的。<o:p></o:p></span></p>
		<table style="WIDTH: 80%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="80%" border="0">
				<tbody>
						<tr>
								<td style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 2.25pt; PADDING-TOP: 2.25pt">
										<p class="MsoNormal">
												<span lang="EN-US" style="FONT-SIZE: 10.5pt">public class Chassis extends CompositeEquipment<br />{<br />　　 public Chassis(String name) { super(name); }<br />　　 public double netPrice() { return 1.+super.netPrice(); }<br />　　 public double discountPrice() { return .5+super.discountPrice(); }<br />} <o:p></o:p></span>
										</p>
										<p>
												<span lang="EN-US">public class Cabinet extends CompositeEquipment<br />{<br />　　 public Cabinet(String name) { super(name); }<br />　　 public double netPrice() { return 1.+super.netPrice(); }<br />　　 public double discountPrice() { return .5+super.discountPrice(); }<br />}<o:p></o:p></span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>至此我们完成了整个<span lang="EN-US">Composite模式的架构。<o:p></o:p></span></p>
		<p style="MARGIN-BOTTOM: 12pt">我们可以看看客户端调用<span lang="EN-US">Composote代码:<br /><br />Cabinet cabinet=new Cabinet("Tower");<br /><br />Chassis chassis=new Chassis("PC Chassis");<br />//将PC Chassis装到Tower中 (将盘盒装到箱子里)<br />cabinet.add(chassis);<br />//将一个10GB的硬盘装到 PC Chassis (将硬盘装到盘盒里)<br />chassis.add(new Disk("10 GB"));<br /><br />//调用 netPrice()方法;<br />System.out.println("netPrice="+cabinet.netPrice());<br />System.out.println("discountPrice="+cabinet.discountPrice());<o:p></o:p></span></p>
		<p>上面调用的方法<span lang="EN-US">netPrice()或discountPrice()，实际上Composite使用Iterator遍历了整个树形结构,寻找同样包含这个方法的对象并实现调用执行.<o:p></o:p></span></p>
		<p>
				<span lang="EN-US">Composite是个很巧妙体现智慧的模式，在实际应用中，如果碰到树形结构，我们就可以尝试是否可以使用这个模式。<o:p></o:p></span>
		</p>
		<p>以论坛为例，一个版<span lang="EN-US">(forum)中有很多帖子(message),这些帖子有原始贴，有对原始贴的回应贴，是个典型的树形结构，那么当然可以使用Composite模式，那么我们进入Jive中看看，是如何实现的.<o:p></o:p></span></p>
		<p>
				<b>
						<span lang="EN-US">Jive解剖</span>
				</b>
				<span lang="EN-US">
						<br />在Jive中 ForumThread是ForumMessages的容器container(组合体).也就是说，ForumThread类似我们上例中的 CompositeEquipment.它和messages的关系如图：<br />[thread]<br />　　 |- [message]<br />　　 |- [message]<br />　　 　　 |- [message]<br />　　 　　 |- [message]<br />　　 　　 　　 |- [message] <o:p></o:p></span>
		</p>
		<p>我们在<span lang="EN-US">ForumThread看到如下代码：<o:p></o:p></span></p>
		<table style="WIDTH: 80%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="80%" border="0">
				<tbody>
						<tr>
								<td style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 2.25pt; PADDING-TOP: 2.25pt">
										<p class="MsoNormal">
												<span lang="EN-US" style="FONT-SIZE: 10.5pt">public interface ForumThread {<br />　　 .... <br />　　 public void addMessage(ForumMessage parentMessage, ForumMessage newMessage)<br />　　 　　 　　 throws UnauthorizedException; <o:p></o:p></span>
										</p>
										<p>　　<span lang="EN-US"> public void deleteMessage(ForumMessage message)<br />　　 　　 　　 throws UnauthorizedException;<o:p></o:p></span></p>
										<p>　　<span lang="EN-US"><br />　　 public Iterator messages();<br />　　 　　 .... <o:p></o:p></span></p>
										<p>
												<span lang="EN-US">}<o:p></o:p></span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>类似<span lang="EN-US">CompositeEquipment, 提供用于访问自己组合体内的部件方法: 增加 删除 遍历.<o:p></o:p></span></p>
		<p>结合我的其他模式中对<span lang="EN-US">Jive的分析，我们已经基本大体理解了Jive论坛体系的框架，如果你之前不理解设计模式，而直接去看Jive源代码，你肯定无法看懂。<br /><br />:)<br /><o:p><br />来源： <a href="http://book.javanb.com/java-design-patterns/Composite.html">http://book.javanb.com/java-design-patterns/Composite.html</a></o:p></span></p>
<img src ="http://www.blogjava.net/nikita/aggbug/233172.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nikita/" target="_blank">picture talk</a> 2008-10-08 16:53 <a href="http://www.blogjava.net/nikita/archive/2008/10/08/233172.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>The PathProxy pattern : Persisting complex associations</title><link>http://www.blogjava.net/nikita/archive/2008/10/04/232356.html</link><dc:creator>picture talk</dc:creator><author>picture talk</author><pubDate>Sat, 04 Oct 2008 11:09:00 GMT</pubDate><guid>http://www.blogjava.net/nikita/archive/2008/10/04/232356.html</guid><wfw:comment>http://www.blogjava.net/nikita/comments/232356.html</wfw:comment><comments>http://www.blogjava.net/nikita/archive/2008/10/04/232356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nikita/comments/commentRss/232356.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nikita/services/trackbacks/232356.html</trackback:ping><description><![CDATA[
		<p>PathProxy is a design pattern for persisting complex relationships without cluttering up your database. <br /><br />When your class relationships require pathing knowledge, that is , knowledge about a number of related objects, then the standard "many - to" associations wont cut it, The PathProxy class is an abstraction of such relationships, allowing you to manage, persist, and extend them without complicating the classes themselves, and without a proliferation of lookup tables.<br /><br />The fundamental idea is this : create class that can point to any entity in the system, and that also can reference its own class as a parent, With this class, you create a tree structure that maintains the interrelationships outside of the referenced objects. Building a JPA mapping around this class requires some though, but is quite powerful.</p>
		<p>
				<strong>Path-Specific relationships<br /><br />The </strong>PathProxy solution applies in any situation where an entity can appear as an association of another entity type, but only for a specific path. I refer to such relationships as path specific. E is a child of D, but only for the path A--&gt;B--&gt;C--&gt;D--&gt;E.On another path, D might have no children (A--&gt;B--&gt;Q--&gt;D) or might have a different child or children(A--&gt;B--&gt;X--&gt;D--&gt;Z)<br /><br />As an example, imagine a development team consisting of a project manager named Johnie and two developers, Robert and Mukunda. On project A, Johnie leads Robert and on Project B, Johnie leads Mukunda. This is a somewhat contrived example, but not an uncommon scenario in the world of corporate structures. In the real world, you might have the efficiency of the same process in different business locations, or the actions taken in response to the same event by different teams<br /><br /><strong><img alt="PathProxy.jpg" src="http://www.blogjava.net/images/blogjava_net/nikita/PathProxy.jpg" width="409" border="0" height="375" /><br /><br />When to use PathProxy?<br /><br /></strong>You have many entities whose interrelationships are complex and require knowledge of other relationships. Creating explicit objects to represent these types of  relationships becomes burdensome. This is expecially true if the objects must be persisted, creating a proliferation of database tables.<br /><br />Consider PathProxy if , Your system design calls for a number of casses whose sole or primary function is to model the relationships between other objects. <br /><br />Using PathProxy is more complicated than using  simple objects to represent relationships, so consider your particular situation. If you have few relationships to store and they are not too complicated, PathProxy may not be the right choice. On the other hand, once you reach a certain level of relationship complexity, using PathProxy will greatly simplify your overall system design. Beijng able to reuse the same machnaism over and over again is also a huge time-saver. <br /><br /><br />来自 : <a href="http://www.javaworld.com/javaworld/jw-07-2008/jw-07-pathproxy.html?page=1">http://www.javaworld.com/javaworld/jw-07-2008/jw-07-pathproxy.html?page=1</a></p>
<img src ="http://www.blogjava.net/nikita/aggbug/232356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nikita/" target="_blank">picture talk</a> 2008-10-04 19:09 <a href="http://www.blogjava.net/nikita/archive/2008/10/04/232356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>