﻿<?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-&lt;font color="#ff6600"&gt;Swing&lt;/font&gt;-文章分类-设计模式</title><link>http://www.blogjava.net/Swing/category/23464.html</link><description>&lt;font size="3"&gt;&lt;br&gt;&lt;font color="#ff6600"&gt;天行健  君子以自强不息&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Thu, 21 Jun 2007 19:54:38 GMT</lastBuildDate><pubDate>Thu, 21 Jun 2007 19:54:38 GMT</pubDate><ttl>60</ttl><item><title>设计模式：结构模式之Bridge</title><link>http://www.blogjava.net/Swing/articles/121850.html</link><dc:creator>Sun</dc:creator><author>Sun</author><pubDate>Mon, 04 Jun 2007 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/Swing/articles/121850.html</guid><wfw:comment>http://www.blogjava.net/Swing/comments/121850.html</wfw:comment><comments>http://www.blogjava.net/Swing/articles/121850.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Swing/comments/commentRss/121850.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Swing/services/trackbacks/121850.html</trackback:ping><description><![CDATA[Bridge：沟通着功能的类层次和实现的类层次<br>功能的类层次：A实现了一些功能 要扩展A就继承生成一个a 这种为了新增功能而建立的类层次称为功能的类层次<br>实现的类层次：抽象类AB&nbsp; ab类实现AB类 这里不是为了新增功能 这种称为实现的类层次<br>例如,一杯咖啡为例,有中杯和大杯之分,同时还有加奶 不加奶之分. 如果用单纯的继承,这四个具体实现(中杯 大杯 加奶 不加奶)之间有概念重叠,因为有中杯加奶,也有中杯不加奶, 如果再在中杯这一层再实现两个继承,很显然混乱,扩展性极差.那我们使用Bridge模式来实现它.&nbsp;<br>如何实现<span lang=EN-US>?<br>以上面提到的咖啡 为例. 我们原来打算只设计一个接口(抽象类),使用Bridge模式后,我们需要将抽象和行为分开,加奶和不加奶属于行为,我们将它们抽象成一个专门的行为接口.<br>程序举例：<br>
<p>先看看抽象部分的接口代码<span lang=EN-US>:<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 Coffee<br>{<br>　　CoffeeImp coffeeImp;<br><br>　　public void setCoffeeImp() {<br>　　　　this.CoffeeImp = CoffeeImpSingleton.getTheCoffeImp();<br>　　}<br><br>　　public CoffeeImp getCoffeeImp() {return this.CoffeeImp;}<br><br>　　public abstract void pourCoffee();<br>}<o:p></o:p></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p>其中<span lang=EN-US>CoffeeImp 是加不加奶的行为接口,看其代码如下:<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 CoffeeImp<br>{<br>　　public abstract void pourCoffeeImp();<br>}<o:p></o:p></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p>现在我们有了两个抽象类<span lang=EN-US>,下面我们分别对其进行继承,实现concrete class:<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>//中杯<br>public class MediumCoffee extends Coffee<br>{<br>　　public MediumCoffee() {setCoffeeImp();}<br><br>　　public void pourCoffee()<br>　　{<br>　　　　CoffeeImp coffeeImp = this.getCoffeeImp();<br>　　　　//我们以重复次数来说明是冲中杯还是大杯 ,重复2次是中杯<br>　　　　for (int i = 0; i &lt; 2; i++)<br>　　　　{<br><br>　　　　　　coffeeImp.pourCoffeeImp();<br>　　　　}<br>　　<br>　　}<br>}<o:p></o:p></span></p>
            <p><span lang=EN-US>//大杯<br>public class SuperSizeCoffee extends Coffee<br>{<br>　　public SuperSizeCoffee() {setCoffeeImp();}<br><br>　　public void pourCoffee()<br>　　{<br>　　　　CoffeeImp coffeeImp = this.getCoffeeImp();<br>　　　　//我们以重复次数来说明是冲中杯还是大杯 ,重复5次是大杯<br>　　　　for (int i = 0; i &lt; 5; i++)<br>　　　　{<br><br>　　　　　　coffeeImp.pourCoffeeImp();<br>　　　　}<br>　　<br>　　}<br>}<o:p></o:p></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p>上面分别是中杯和大杯的具体实现<span lang=EN-US>.下面再对行为CoffeeImp进行继承:<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>//加奶<br>public class MilkCoffeeImp extends CoffeeImp<br>{<br>　　MilkCoffeeImp() {}<br><br>　　public void pourCoffeeImp()<br>　　{<br>　　　　System.out.println("加了美味的牛奶");<br>　　}<br>}<o:p></o:p></span></p>
            <p><span lang=EN-US>//不加奶<br>public class FragrantCoffeeImp extends CoffeeImp<br>{<br>　　FragrantCoffeeImp() {}<br><br>　　public void pourCoffeeImp()<br>　　{<br>　　　　System.out.println("什么也没加,清香");<br>　　}<br>}<o:p></o:p></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span lang=EN-US>Bridge模式的基本框架我们已经搭好了,别忘记定义中还有一句:动态结合,我们现在可以喝到至少四种咖啡:<br>1.中杯加奶<br>2.中杯不加奶<br>3.大杯加奶<br>4.大杯不加奶<o:p></o:p></span></p>
<p>看看是如何动态结合的<span lang=EN-US>,在使用之前,我们做个准备工作,设计一个单态类(Singleton)用来hold当前的CoffeeImp:<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 CoffeeImpSingleton<br>{<br>　　private static CoffeeImp coffeeImp;<br><br>　　public CoffeeImpSingleton(CoffeeImp coffeeImpIn)<br>　　 {this.coffeeImp = coffeeImpIn;}<br><br>　　public static CoffeeImp getTheCoffeeImp()<br>　　{<br>　　　　return coffeeImp;<br>　　}<br>}<o:p></o:p></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p>看看中杯加奶 和大杯加奶 是怎么出来的<span lang=EN-US>:<o:p></o:p></span></p>
<p><span lang=EN-US>//拿出牛奶<br>CoffeeImpSingleton coffeeImpSingleton = new CoffeeImpSingleton(new MilkCoffeeImp());<br><br>//中杯加奶<br>MediumCoffee mediumCoffee = new MediumCoffee();<br>mediumCoffee.pourCoffee();<br><br>//大杯加奶<br>SuperSizeCoffee superSizeCoffee = new SuperSizeCoffee();<br>superSizeCoffee.pourCoffee();<o:p></o:p></span></p>
<p>注意<span lang=EN-US>: Bridge模式的执行类如CoffeeImp和Coffee是一对一的关系, 正确创建CoffeeImp是该模式的关键,<o:p></o:p></span></p>
<o:p></o:p></span>
<img src ="http://www.blogjava.net/Swing/aggbug/121850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Swing/" target="_blank">Sun</a> 2007-06-04 15:33 <a href="http://www.blogjava.net/Swing/articles/121850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式：结构模式之Decorator(油漆工)</title><link>http://www.blogjava.net/Swing/articles/121844.html</link><dc:creator>Sun</dc:creator><author>Sun</author><pubDate>Mon, 04 Jun 2007 07:09:00 GMT</pubDate><guid>http://www.blogjava.net/Swing/articles/121844.html</guid><wfw:comment>http://www.blogjava.net/Swing/comments/121844.html</wfw:comment><comments>http://www.blogjava.net/Swing/articles/121844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Swing/comments/commentRss/121844.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Swing/services/trackbacks/121844.html</trackback:ping><description><![CDATA[<p><strong><span lang=EN-US>Decorator定义</span></strong><span lang=EN-US>:<br>动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.<o:p></o:p></span></p>
<p><strong>为什么使用<span lang=EN-US>Decorator</span></strong><span lang=EN-US>?<br>我们通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的.<o:p></o:p></span></p>
<p>使用<span lang=EN-US>Decorator的理由是:这些功能需要由用户动态决定加入的方式和时机.Decorator提供了"即插即用"的方法,在运行期间决定何时增加何种功能.<o:p></o:p></span></p>
<p>程序举例：<br>Display.java:<br>public abstract class Display {<br>&nbsp;public abstract int getColumns(); // 取得横向的字数</p>
<p>&nbsp;public abstract int getRows(); // 取得直向的行数</p>
<p>&nbsp;public abstract String getRowText(int row); // 取得第row个字串</p>
<p>&nbsp;public final void show() { // 打印所有內容<br>&nbsp;&nbsp;for (int i = 0; i &lt; getRows(); i++) {<br>&nbsp;&nbsp;&nbsp;System.out.println(getRowText(i));<br>&nbsp;&nbsp;}<br>&nbsp;}<br>}<br>Border .java:<br>public abstract class Border extends Display {<br>&nbsp;&nbsp;&nbsp; protected Display display;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 指装饰外框里面的「內容」??<br>&nbsp;&nbsp;&nbsp; protected Border(Display display) { // 在产生对象实例时，以参数指定「內容」<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.display = display;<br>&nbsp;&nbsp;&nbsp; }<br>}<br></p>
StringDisplay .java:<br>public class StringDisplay extends Display {<br>&nbsp;private String string; // 打印的字串
<p>&nbsp;public StringDisplay(String string) { // 以参数指定打印的字串<br>&nbsp;&nbsp;this.string = string;<br>&nbsp;}</p>
<p>&nbsp;public int getColumns() { // 字数<br>&nbsp;&nbsp;return string.getBytes().length;<br>&nbsp;}</p>
<p>&nbsp;public int getRows() { // 行数为1<br>&nbsp;&nbsp;return 1;<br>&nbsp;}</p>
<p>&nbsp;public String getRowText(int row) { // 仅在row为0时才返回<br>&nbsp;&nbsp;if (row == 0) {<br>&nbsp;&nbsp;&nbsp;return string;<br>&nbsp;&nbsp;} else {<br>&nbsp;&nbsp;&nbsp;return null;<br>&nbsp;&nbsp;}<br>&nbsp;}<br>}<br><br>SideBorder.java:<br>public class SideBorder extends Border {<br>&nbsp;private char borderChar; // 装饰字符</p>
<p>&nbsp;public SideBorder(Display display, char ch) { // 以构造子指定Display和装饰字符 <br>&nbsp;&nbsp;super(display);<br>&nbsp;&nbsp;this.borderChar = ch;<br>&nbsp;}</p>
<p>&nbsp;public int getColumns() { // 字数要再加上內容两边的装饰字符<br>&nbsp;&nbsp;return 1 + display.getColumns() + 1;<br>&nbsp;}</p>
<p>&nbsp;public int getRows() { // 行数同內容的行数<br>&nbsp;&nbsp;return display.getRows();<br>&nbsp;}</p>
<p>&nbsp;public String getRowText(int row) { // 指定该行的內容即为在內容之指定行的两边<br>&nbsp;&nbsp;// 加上装饰字符</p>
<p>&nbsp;&nbsp;return borderChar + display.getRowText(row) + borderChar;<br>&nbsp;}<br>}<br><br>UpDownBorder .java:<br>public class UpDownBorder extends Border {<br>&nbsp;private char borderChar; // 装饰字符</p>
<p>&nbsp;public UpDownBorder(Display display, char ch) { // 以构造子指定Display和装饰字符<br>&nbsp;&nbsp;super(display);<br>&nbsp;&nbsp;this.borderChar = ch;<br>&nbsp;}</p>
<p>&nbsp;public int getColumns() { // 字数同內容的字数<br>&nbsp;&nbsp;return display.getColumns();<br>&nbsp;}</p>
<p>&nbsp;public int getRows() { // 行数要再加上內容上下的装饰字符的行数<br>&nbsp;&nbsp;return 1 + display.getRows() + 1;<br>&nbsp;}</p>
<p>&nbsp;public String getRowText(int row) { // 指定该行的內容<br>&nbsp;&nbsp;if (row == 0 || row == getRows() - 1) {<br>&nbsp;&nbsp;&nbsp;return makeLine(borderChar, getColumns());<br>&nbsp;&nbsp;} else {<br>&nbsp;&nbsp;&nbsp;return display.getRowText(row - 1);<br>&nbsp;&nbsp;}<br>&nbsp;}</p>
<p>&nbsp;private String makeLine(char ch, int count) { // 以字符ch，建立重复count次的连续字串<br>&nbsp;&nbsp;StringBuffer buf = new StringBuffer();<br>&nbsp;&nbsp;for (int i = 0; i &lt; count; i++) {<br>&nbsp;&nbsp;&nbsp;buf.append(ch);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return buf.toString();<br>&nbsp;}<br>}</p>
<br>Main.java:<br>public class Main {<br>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Display b1 = new StringDisplay("Hello, world.");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Display b2 = new UpDownBorder(b1, '-');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Display b3 = new SideBorder(b2, '*');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b1.show();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b2.show();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b3.show();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Display b4 = <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new FullBorder(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new UpDownBorder(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new SideBorder(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new UpDownBorder(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new SideBorder(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new StringDisplay("您好。"),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '*'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '='<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '|'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '/'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b4.show();<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>注意：display继承类中的getRowText方法<br>这个方法把所有的用法都继集成到一起 
<img src ="http://www.blogjava.net/Swing/aggbug/121844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Swing/" target="_blank">Sun</a> 2007-06-04 15:09 <a href="http://www.blogjava.net/Swing/articles/121844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式：结构模式之Composite(组合)</title><link>http://www.blogjava.net/Swing/articles/121789.html</link><dc:creator>Sun</dc:creator><author>Sun</author><pubDate>Mon, 04 Jun 2007 03:41:00 GMT</pubDate><guid>http://www.blogjava.net/Swing/articles/121789.html</guid><wfw:comment>http://www.blogjava.net/Swing/comments/121789.html</wfw:comment><comments>http://www.blogjava.net/Swing/articles/121789.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Swing/comments/commentRss/121789.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Swing/services/trackbacks/121789.html</trackback:ping><description><![CDATA[<span lang=EN-US><strong>Composite定义</strong></span><span lang=EN-US>:<br>将对象以树形结构组织起来,以达成&#8220;部分－整体&#8221; 的层次结构，使得客户端对单个对象和组合对象的使用具有一致性.<br><br><o:p>
<p><strong>使用<span>Composite</span></strong><span><br>首先定义一个接口或抽象类，这是设计模式通用方式了，其他设计模式对接口内部定义限制不多，Composite却有个规定，那就是要在接口内部定义一个用于访问和管理Composite组合体的对象们（或称部件Component）.</span></p>
<p>下面的代码是以抽象类定义，一般尽量用接口<span>interface,</span></p>
<table cellSpacing=3 cellPadding=0 width="80%" border=0>
    <tbody>
        <tr>
            <td>
            <p><span>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>} </span></p>
            </td>
        </tr>
    </tbody>
</table>
<p>抽象类<span>Equipment就是Component定义，代表着组合体类的对象们,Equipment中定义几个共同的方法。</span></p>
<table cellSpacing=3 cellPadding=0 width="80%" border=0>
    <tbody>
        <tr>
            <td>
            <p><span>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>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span>Disk是组合体内的一个对象，或称一个部件，这个部件是个单独元素( Primitive)。<br>还有一种可能是，一个部件也是一个组合体，就是说这个部件下面还有'儿子'，这是树形结构中通常的情况，应该比较容易理解。现在我们先要定义这个组合体：</span></p>
<table cellSpacing=3 cellPadding=0 width="80%" border=0>
    <tbody>
        <tr>
            <td>
            <p><span>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>　　</span></p>
            <p>　　<span>//注意这里，这里就提供用于访问自己组合体内的部件方法。<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>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p>上面<span>CompositeEquipment继承了Equipment,同时为自己里面的对象们提供了外部访问的方法,重载了Iterator,Iterator是Java的Collection的一个接口，是Iterator模式的实现.</span></p>
<p>我们再看看<span>CompositeEquipment的两个具体类:盘盒Chassis和箱子Cabinet，箱子里面可以放很多东西，如底板，电源盒，硬盘盒等；盘盒里面可以放一些小设备，如硬盘 软驱等。无疑这两个都是属于组合体性质的。</span></p>
<table cellSpacing=3 cellPadding=0 width="80%" border=0>
    <tbody>
        <tr>
            <td>
            <p><span>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>} </span></p>
            <p><span>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>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p>至此我们完成了整个<span>Composite模式的架构。</span></p>
<p>我们可以看看客户端调用<span>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());</span></p>
<p>上面调用的方法<span>netPrice()或discountPrice()，实际上Composite使用Iterator遍历了整个树形结构,寻找同样包含这个方法的对象并实现调用执行.</span></p>
<p><span>Composite是个很巧妙体现智慧的模式，在实际应用中，如果碰到树形结构，我们就可以尝试是否可以使用这个模式。</span></p>
</o:p></span>
<img src ="http://www.blogjava.net/Swing/aggbug/121789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Swing/" target="_blank">Sun</a> 2007-06-04 11:41 <a href="http://www.blogjava.net/Swing/articles/121789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式：结构模式之Proxy(代理)</title><link>http://www.blogjava.net/Swing/articles/121775.html</link><dc:creator>Sun</dc:creator><author>Sun</author><pubDate>Mon, 04 Jun 2007 02:57:00 GMT</pubDate><guid>http://www.blogjava.net/Swing/articles/121775.html</guid><wfw:comment>http://www.blogjava.net/Swing/comments/121775.html</wfw:comment><comments>http://www.blogjava.net/Swing/articles/121775.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Swing/comments/commentRss/121775.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Swing/services/trackbacks/121775.html</trackback:ping><description><![CDATA[<p><span lang=EN-US>Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,Proxy是代理的意思,我们也许有代理服务器等概念,代理概念可以解释为:在出发点到目的地之间有一道中间层,意为代理.</span></p>
<p><strong>设计模式中定义</strong><span lang=EN-US>: 为其他对象提供一种代理以控制对这个对象的访问.要用再建立<br>程序举例1：权限访问<br>
<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>public class ForumProxy implements Forum {</span></p>
            <p><span lang=EN-US>private ForumPermissions permissions;<br>private Forum forum; <br>this.authorization = authorization; <br><br>public ForumProxy(Forum forum, Authorization authorization,<br>ForumPermissions permissions)<br>{<br>this.forum = forum;<br>this.authorization = authorization;<br>this.permissions = permissions;<br>}<br><br>.....</span></p>
            <p><span lang=EN-US>public void setName(String name) throws UnauthorizedException,<br>ForumAlreadyExistsException<br>{<br>　　//只有是系统或论坛管理者才可以修改名称<br>　　if (permissions.isSystemOrForumAdmin()) {<br>　　　　forum.setName(name);<br>　　}<br>　　else {<br>　　　　throw new UnauthorizedException();<br>　　}<br>}</span></p>
            <p><span lang=EN-US>...</span></p>
            <p><span lang=EN-US>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>而<span lang=EN-US>DbForum才是接口Forum的真正实现,以修改论坛名称为例:</span></p>
<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>public class DbForum implements Forum, Cacheable {<br>...</span></p>
            <p><span lang=EN-US>public void setName(String name) throws ForumAlreadyExistsException {<br><br>　　....<br><br>　　this.name = name;<br>　　//这里真正将新名称保存到数据库中 <br>　　saveToDb();</span></p>
            <p>　　<span lang=EN-US>....<br>}</span></p>
            <p><span lang=EN-US><br>... </span></p>
            <p><span lang=EN-US>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><br>凡是涉及到对论坛名称修改这一事件<span lang=EN-US>,其他程序都首先得和ForumProxy打交道,由ForumProxy决定是否有权限做某一样事情,ForumProxy是个名副其实的"网关","安全代理系统".<br>程序举例2：用到才创建<br>实际执行打印 为了模仿长时间操作 在构建的时候延迟5S<br>public class Printer implements Printable {<br>&nbsp;private String name;</span></p>
<p><span lang=EN-US>&nbsp;public Printer() {<br>&nbsp;&nbsp;heavyJob("正在产生Printer的对象实例");<br>&nbsp;}</span></p>
<p><span lang=EN-US>&nbsp;public Printer(String name) { // 构造子<br>&nbsp;&nbsp;this.name = name;<br>&nbsp;&nbsp;heavyJob("正在产生Printer的对象实例(" + name + ")");<br>&nbsp;}</span></p>
<p><span lang=EN-US>&nbsp;public void setPrinterName(String name) { // 命名<br>&nbsp;&nbsp;this.name = name;<br>&nbsp;}</span></p>
<p><span lang=EN-US>&nbsp;public String getPrinterName() { // 取得名称<br>&nbsp;&nbsp;return name;<br>&nbsp;}</span></p>
<p><span lang=EN-US>&nbsp;public void print(String string) { // 输出名称<br>&nbsp;&nbsp;System.out.println("=== " + name + " ===");<br>&nbsp;&nbsp;System.out.println(string);<br>&nbsp;}</span></p>
<p><span lang=EN-US>&nbsp;private void heavyJob(String msg) { // 较重的工作（假设）<br>&nbsp;&nbsp;System.out.print(msg);<br>&nbsp;&nbsp;for (int i = 0; i &lt; 5; i++) {<br>&nbsp;&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(1000);<br>&nbsp;&nbsp;&nbsp;} catch (InterruptedException e) {<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;System.out.print(".");<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;System.out.println("完成。");<br>&nbsp;}<br>}<br>代理类：真正要打印了才去调用生成printer并且参数赋值进行打印操作<br>public class PrinterProxy implements Printable {<br>&nbsp;private String name; // 名称</span></p>
<p><span lang=EN-US>&nbsp;private Printable real; // 「本人」</span></p>
<p><span lang=EN-US>&nbsp;private String className; // 「本人」的类名称</span></p>
<p><span lang=EN-US>&nbsp;public PrinterProxy(String name, String className) { // 构造子<br>&nbsp;&nbsp;this.name = name;<br>&nbsp;&nbsp;this.className = className;<br>&nbsp;}</span></p>
<p><span lang=EN-US>&nbsp;public synchronized void setPrinterName(String name) { // 命名<br>&nbsp;&nbsp;if (real != null) {<br>&nbsp;&nbsp;&nbsp;real.setPrinterName(name); //「本人」也要命名<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;this.name = name;<br>&nbsp;}</span></p>
<p><span lang=EN-US>&nbsp;public String getPrinterName() { // 取得名称<br>&nbsp;&nbsp;return name;<br>&nbsp;}</span></p>
<p><span lang=EN-US>&nbsp;public void print(String string) { // 输出到画面上<br>&nbsp;&nbsp;realize();<br>&nbsp;&nbsp;real.print(string);<br>&nbsp;}</span></p>
<p><span lang=EN-US>&nbsp;private synchronized void realize() { // 产生「本人」<br>&nbsp;&nbsp;if (real == null) {<br>&nbsp;&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;&nbsp;real = (Printable) Class.forName("Proxy." + className)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.newInstance();<br>&nbsp;&nbsp;&nbsp;&nbsp;real.setPrinterName(name);<br>&nbsp;&nbsp;&nbsp;} catch (ClassNotFoundException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;System.err.println("找不到类 " + className + "。");<br>&nbsp;&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;}<br>}<br>无论怎么调用setPrinterName方法都不会产生real实例 只有真正需要生成本人的时候才会生成<br>测试方法：<br>public class Main {<br>&nbsp;public static void main(String[] args) {<br>&nbsp;&nbsp;Printable p = new PrinterProxy("Alice", "Printer");<br>&nbsp;&nbsp;System.out.println("现在的名称是" + p.getPrinterName() + "。");<br>&nbsp;&nbsp;p.setPrinterName("Bob");<br>//不会生成Printer<br>&nbsp;&nbsp;System.out.println("现在的名称是" + p.getPrinterName() + "。");<br>//不会生成Printer<br>&nbsp;&nbsp;p.print("Hello, world.");<br>//生成Printer<br>&nbsp;}<br>}</p>
</span></span>
<img src ="http://www.blogjava.net/Swing/aggbug/121775.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Swing/" target="_blank">Sun</a> 2007-06-04 10:57 <a href="http://www.blogjava.net/Swing/articles/121775.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式：创建模式之Singleton(单态)</title><link>http://www.blogjava.net/Swing/articles/120814.html</link><dc:creator>Sun</dc:creator><author>Sun</author><pubDate>Wed, 30 May 2007 02:11:00 GMT</pubDate><guid>http://www.blogjava.net/Swing/articles/120814.html</guid><wfw:comment>http://www.blogjava.net/Swing/comments/120814.html</wfw:comment><comments>http://www.blogjava.net/Swing/articles/120814.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Swing/comments/commentRss/120814.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Swing/services/trackbacks/120814.html</trackback:ping><description><![CDATA[Singleton应该说是平时用的最多的一种模式之一<br>Singleton模式主要作用是保证在Java应用程序中，一个类Class只有一个实例存在。<br>一般Singleton模式通常有几种形式:
<table cellSpacing=3 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td>
            <p><span>public class Singleton {</span></p>
            <p>　　<span>private Singleton(){}</span></p>
            <p>　　<span>//在自己内部定义自己一个实例，是不是很奇怪？<br>　　//注意这是private 只供内部调用</span></p>
            <p>　　<span>private static Singleton instance = new Singleton();</span></p>
            <p>　　<span>//这里提供了一个供外部访问本class的静态方法，可以直接访问　　<br>　　public static Singleton getInstance() {<br>　　　　return instance; 　　<br>　　 } <br>//当程序第一次调用getInstance的时候初始化Singleton 类 同时初始化static字段 产生唯一的对象实例<br>} </span></p>
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
<p>第二种形式<span>:</span></p>
<table cellSpacing=3 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td>
            <p><span>public class Singleton { </span></p>
            <p>　　<span>private static Singleton instance = null;<br><br>　　public static synchronized Singleton getInstance() {<br><br>　　//这个方法比上面有所改进，不用每次都进行生成对象，只是第一次　　　 　<br>　　//使用时生成实例，提高了效率！<br>　　if (instance==null)<br>　　　　instance＝new Singleton();<br>　　return instance; 　　} </span></p>
            <p><span>} </span></p>
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
<p>使用<span>Singleton.getInstance()可以访问单态类。</span></p>
<p>上面第二中形式是<span>lazy initialization，也就是说第一次调用时初始Singleton，以后就不用再生成了。</span></p>
<p>注意到<span>lazy initialization形式中的synchronized，这个synchronized很重要，如果没有synchronized，那么使用getInstance()是有可能得到多个Singleton实例。</span></p>
<p>一般认为第一种形式要更加安全些。</p>
<img src ="http://www.blogjava.net/Swing/aggbug/120814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Swing/" target="_blank">Sun</a> 2007-05-30 10:11 <a href="http://www.blogjava.net/Swing/articles/120814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式：创建模式之Builder</title><link>http://www.blogjava.net/Swing/articles/120804.html</link><dc:creator>Sun</dc:creator><author>Sun</author><pubDate>Wed, 30 May 2007 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/Swing/articles/120804.html</guid><wfw:comment>http://www.blogjava.net/Swing/comments/120804.html</wfw:comment><comments>http://www.blogjava.net/Swing/articles/120804.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Swing/comments/commentRss/120804.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Swing/services/trackbacks/120804.html</trackback:ping><description><![CDATA[<p><strong><span lang=EN-US>Builder模式定义</span></strong><span lang=EN-US>:<br>将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.<o:p></o:p></span></p>
<p><span lang=EN-US>Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们.用户不知道内部的具体构建细节.Builder模式是非常类似抽象工厂模式,细微的区别大概只有在反复使用中才能体会到.<o:p></o:p></span></p>
<br>为了将构建复杂对象的<strong><em>过程</em></strong>和它的<strong><em>部件</em></strong>解耦.注意: 是解耦<strong><em>过程</em></strong>和<strong><em>部件</em></strong>.<br>
<p>因为一个复杂的对象<span lang=EN-US>,不但有很多大量组成部分,如汽车,有很多部件:车轮 方向盘 发动机还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一辆汽车,这个装配过程也很复杂(需要很好的组装技术),Builder模式就是为了将部件和组装过程分开.<o:p></o:p></span></p>
<o:p>
<p>首先<span lang=EN-US>,需要一个接口,它定义如何创建复杂对象的各个部件:<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>public interface Builder { <o:p></o:p></span></p>
            <p>　　<span lang=EN-US>//创建部件A　　比如创建汽车车轮<br>　　void buildPartA(); <br>　　//创建部件B 比如创建汽车方向盘<br>　　void buildPartB(); <br>　　//创建部件C 比如创建汽车发动机<br>　　void buildPartC(); <br><br>　　//返回最后组装成品结果 (返回最后装配好的汽车)<br>　　//成品的组装过程不在这里进行,而是转移到下面的Director类中进行.<br>　　//从而实现了解耦<strong><em>过程</em></strong>和<strong><em>部件</em></strong><br>　　Product getResult(); <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>Director构建最后的复杂对象,而在上面Builder接口中封装的是如何创建一个个部件(复杂对象是由这些部件组成的),也就是说Director的内容是如何将部件最后组装成成品:<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>public class Director {<o:p></o:p></span></p>
            <p>　　<span lang=EN-US>private Builder builder; <o:p></o:p></span></p>
            <p>　　<span lang=EN-US>public Director( Builder builder ) { <br>　　　　this.builder = builder; <br>　　} <br>　　// 将部件partA partB partC最后组成复杂对象<br>　　//这里是将车轮 方向盘和发动机组装成汽车的过程<br>　　public void construct() { <br>　　　　builder.buildPartA();<br>　　　　builder.buildPartB();<br>　　　　builder.buildPartC(); <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>Builder的具体实现ConcreteBuilder:<br>通过具体完成接口Builder来构建或装配产品的部件;<br>定义并明确它所要创建的是什么具体东西;<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>public class ConcreteBuilder implements Builder { <o:p></o:p></span></p>
            <p>　　<span lang=EN-US>Part partA, partB, partC; <br>　　public void buildPartA() {<br>　　　　//这里是具体如何构建partA的代码<br><br>　　}; <br>　　public void buildPartB() { <br>　　　　//这里是具体如何构建partB的代码<br>　　}; <br>　　 public void buildPartC() { <br>　　　　//这里是具体如何构建partB的代码<br>　　}; <br>　　 public Product getResult() { <br>　　　　//返回最后组装成品结果<br>　　}; <o:p></o:p></span></p>
            <p><span lang=EN-US>}<o:p></o:p></span></p>
            </td>
        </tr>
    </tbody>
</table>
<br>ConcreteBuilder builder = new ConcreteBuilder();<br>Director director = new Director( builder ); <br><br>director.construct(); <br>Product product = builder.getResult(); <br><br>builder类图：<br><img height=380 alt="" src="http://www.blogjava.net/images/blogjava_net/swing/builder.PNG" width=649 border=0><o:p></o:p></o:p> 
<img src ="http://www.blogjava.net/Swing/aggbug/120804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Swing/" target="_blank">Sun</a> 2007-05-30 09:54 <a href="http://www.blogjava.net/Swing/articles/120804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式：创建模式之Prototype(原型)</title><link>http://www.blogjava.net/Swing/articles/120699.html</link><dc:creator>Sun</dc:creator><author>Sun</author><pubDate>Tue, 29 May 2007 07:43:00 GMT</pubDate><guid>http://www.blogjava.net/Swing/articles/120699.html</guid><wfw:comment>http://www.blogjava.net/Swing/comments/120699.html</wfw:comment><comments>http://www.blogjava.net/Swing/articles/120699.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Swing/comments/commentRss/120699.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Swing/services/trackbacks/120699.html</trackback:ping><description><![CDATA[<p>复制产生对象实例：<br>使用Prototype模式可以理解为&nbsp; 创造出一个和已有对象一样的对象<br>ex)指着面包店橱窗里的面包告诉老板 我就要这个 虽然不知道名字 也不知道做法&nbsp;但是能买到和所指的相同的东西。<br>实例：<br>1、定义一个接口 实现Cloneable<br>public interface Product extends Cloneable {<br>&nbsp;&nbsp;&nbsp; public abstract void use(String s);<br>&nbsp;&nbsp;&nbsp; public abstract Product createClone();<br>}<br>2、声明一个manage类来根据Product的createClone来进行复制<br>public class Manager {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Hashtable showcase = new Hashtable();<br>&nbsp;&nbsp;&nbsp; public void register(String name, Product proto) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; showcase.put(name, proto);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; public Product create(String protoname) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Product p = (Product)showcase.get(protoname);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return p.createClone();<br>&nbsp;&nbsp;&nbsp; }<br>}<br>3、Product类的一个具体实现<br>public class UnderlinePen implements Product {<br>&nbsp;&nbsp;&nbsp; private char ulchar;<br>&nbsp;&nbsp;&nbsp; public UnderlinePen(char ulchar) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.ulchar = ulchar;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; public void use(String s) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int length = s.getBytes().length;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("\""&nbsp; + s + "\"");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(" ");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; length; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(ulchar);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; public Product createClone() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Product p = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p = (Product)clone();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (CloneNotSupportedException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return p;<br>&nbsp;&nbsp;&nbsp; }<br>}<br>4、具体使用<br>&nbsp;&nbsp;&nbsp;&nbsp; // 预备阶段<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Manager manager = new Manager();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UnderlinePen upen = new UnderlinePen('~');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox mbox = new MessageBox('*');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox sbox = new MessageBox('/');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; manager.register("strong message", upen);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; manager.register("warning box", mbox);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; manager.register("slash box", sbox);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 实现产生<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Product p1 = manager.create("strong message");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p1.use("Hello, world.");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Product p2 = manager.create("warning box");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p2.use("Hello, world.");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Product p3 = manager.create("slash box");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p3.use("Hello, world.");<br>&nbsp;&nbsp;&nbsp; }<br><br>也可以将product声明成抽象类实现Cloneable接口<br>并且实现createClone方法<br>这样子类中就不用再声明creatClone方法了 简化了代码<br><br>clone方法在Object中定义 因此所有类都会继承clone()方法<br>Cloneable这个接口表示 可用clone()方法进行复制<br>clone()方法做的是浅拷贝 所做的操作是直接复制字段内容 并不管该字段对应的对象实例内容 假定有一个数组 当使用clone方法进行拷贝以后 复制的结果，只是对应到该数组的参照 即指向该数组的内存地址 如果想做深拷贝 必须重写clone方法 记得要加上super.clone()</p>
<img src ="http://www.blogjava.net/Swing/aggbug/120699.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Swing/" target="_blank">Sun</a> 2007-05-29 15:43 <a href="http://www.blogjava.net/Swing/articles/120699.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式：创建对象之Factory</title><link>http://www.blogjava.net/Swing/articles/120690.html</link><dc:creator>Sun</dc:creator><author>Sun</author><pubDate>Tue, 29 May 2007 07:12:00 GMT</pubDate><guid>http://www.blogjava.net/Swing/articles/120690.html</guid><wfw:comment>http://www.blogjava.net/Swing/comments/120690.html</wfw:comment><comments>http://www.blogjava.net/Swing/articles/120690.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Swing/comments/commentRss/120690.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Swing/services/trackbacks/120690.html</trackback:ping><description><![CDATA[Factory有两种理解方式，个人感觉不太一样，不知道哪种理解方式比较正确<br>1、引入Factory &nbsp;Pattern的目的是为了封装类的实例化操作<br>
<p><span lang=EN-US>public class Factory{<o:p></o:p></span></p>
<p>　　<span lang=EN-US>public static Sample creator(int which){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span lang=EN-US>//getClass 产生Sample 一般可使用动态类装载装入类。<br>　　if (which==1)<br>　　　　return new SampleA();<br>　　else if (which==2)<br>　　　　return new SampleB();<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>,如果要实例化Sample时.就使用<o:p></o:p></span></p>
<p><span lang=EN-US>Sample sampleA=Factory.creator(1);<o:p></o:p></span></p>
<p>这样<span lang=EN-US>,在整个就不涉及到Sample的具体子类,达到封装效果,也就减少错误修改的机会,这个原理可以用很通俗的话来比喻:就是具体事情做得越多,越容易范错误</span></p>
<p>2、Factory Pattern在父类规定对象的创建方法，但不深入到具体的类名，所有具体的实现都放在了子类，大致可以分为产生对象实例的大纲(框架)和实际产生对象实例的类两方面<br><br>实例：<br><img height=150 alt="" src="http://www.blogjava.net/images/blogjava_net/swing/Factory.PNG" width=150 border=0><br>framework中的Factory是实现creat的抽象类<br>&nbsp;public final Product creat(String owner) {<br>&nbsp;&nbsp;Product p = creadProduct(owner);<br>&nbsp;&nbsp;registerProduct(p);<br>&nbsp;&nbsp;return p;<br>&nbsp;}</p>
<p>&nbsp;public abstract Product creadProduct(String owner);<br>famework中的Product是仅实现use方法的抽象类<br><br>具体的生成和使用方法都用idcard中的类具体实现<br>&nbsp;IDcardFactory：<br>&nbsp;IDcardFactory extends Factory&nbsp;<br>&nbsp;public synchronized Product creadProduct(String owner) {<br>&nbsp;&nbsp;IDcard ic = new IDcard(owner);<br>&nbsp;&nbsp;return ic;<br>&nbsp;}</p>
<p>IDcarrd：<br>class IDcard extends Product<br>IDcard(String owner) {<br>&nbsp;&nbsp;System.out.println("建立" + owner +"的卡");<br>&nbsp;&nbsp;this.owner = owner;<br>&nbsp;}<br>此处构造函数不是public 只有通过同一个包中的factory才可以产生这个对象实例</p>
<p>&nbsp;public void use() {<br>&nbsp;&nbsp;System.out.println("使用"&nbsp; + owner&nbsp;+ "的卡");<br>&nbsp;}<br><br>具体使用：<br>&nbsp;public static void main(String[] args) {<br>&nbsp;&nbsp;Factory fc = new IDcardFactory();<br>&nbsp;&nbsp;Product p1 = fc.creat("card1");<br>&nbsp;&nbsp;Product p2 = fc.creat("card2");<br>&nbsp;&nbsp;Product p3 = fc.creat("card3");<br>&nbsp;&nbsp;p1.use();<br>&nbsp;&nbsp;p2.use();<br>&nbsp;&nbsp;p3.use();<br>&nbsp;}<br>这样不必修改framework包中的内容就能够创建出不同的产品和工厂</p>
<img src ="http://www.blogjava.net/Swing/aggbug/120690.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Swing/" target="_blank">Sun</a> 2007-05-29 15:12 <a href="http://www.blogjava.net/Swing/articles/120690.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>