﻿<?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-thisliy-随笔分类-design pattern</title><link>http://www.blogjava.net/thisliy/category/42334.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 05 Nov 2009 16:35:25 GMT</lastBuildDate><pubDate>Thu, 05 Nov 2009 16:35:25 GMT</pubDate><ttl>60</ttl><item><title>Java装饰模式</title><link>http://www.blogjava.net/thisliy/archive/2009/11/01/300543.html</link><dc:creator>liyang</dc:creator><author>liyang</author><pubDate>Sun, 01 Nov 2009 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/thisliy/archive/2009/11/01/300543.html</guid><wfw:comment>http://www.blogjava.net/thisliy/comments/300543.html</wfw:comment><comments>http://www.blogjava.net/thisliy/archive/2009/11/01/300543.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/thisliy/comments/commentRss/300543.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/thisliy/services/trackbacks/300543.html</trackback:ping><description><![CDATA[<h3><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">说明：</span></span></span></span></h3>
<span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;装饰模式是在不必改变原类文件和使用继承的情况下，动态的扩展一个对象的功能。它是通过创建一个包装对象，也就是装饰来包裹真实的对象。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span>
<h4><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">装饰模式的特点；<br />
</span></span></span></span></h4>
<p dir="ltr"><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">（1） 装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。<br />
（2） 装饰对象包含一个真实对象的索引（reference）<br />
（3） 装饰对象接受所有的来自客户端的请求。它把这些请求转发给真实的对象。<br />
（4） 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时，不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中，通常是通过继承来实现对给定类的功能扩展。<br />
<br />
</span></span></span></span></p>
<h4><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">装饰模式 VS 继承</span></span></span></span></h4>
<p><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">&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;&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;用来扩展一类对象的功能<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;&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;&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;&nbsp;&nbsp;编译时分派职责<br />
防止由于子类而导致的复杂和混乱&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;缺乏灵活性<br />
</span></span></span></span></p>
<h3><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">例子：</span></span></span></span></h3>
<p><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;让我们重新返回我们在工厂方法和单例模式log实用工具上，我们的模式主要由Logger 接口和两个它的实现类??FileLogger和ConsoleLogger??分别把信息出力到一个文件和屏幕中。另外，还有包括工厂方法的LoggerFactory类。<br />
LoggerFactory没有出现在下图中，主要是因为它和现在讨论的例子没有直接联系。<br />
<br />
让我们想象一些客户端需要以超出Logger Utility现在所提供的新的方式出力信息，客户端需要下面两种特征；<br />
（1） 把出力的信息传唤为HTML文档<br />
（2） 对出力信息进行逻辑转化的简单加密，在面向对象的设计中，不改变现存的类的代码，可以应用继承来增加新的功能。例如，子类化现在的类重载它的方法来增加所需要的新功能。</span></span></span></span></p>
<p><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">应用继承，我们要子类化FileLogger和ConsoleLogger类来增加新的功能，会有下面的一组新的子类：<br />
子类 父类 功能<br />
HTMLFileLogger FileLogger 转化出力信息为HTML文档，并存入一个Log文件<br />
HTMLConsLogger ConsoleLogger 转化出力信息为HTML文档，并显示在屏幕上<br />
EncFileLogger FileLogger 加密出力信息，并存入一个Log文件<br />
EncConsLogger ConsoleLogger 加密出力信息，并显示在屏幕上</span></span></span></span></p>
<p><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">从类图可以看到，为了实现新的功能加入了一组新的子类。如果我们还有其他的Logger类型（例如：DBLogger出力信息到数据库中），这样会有更多子类。当一个新的特性需要被加入，子类的数量会有成倍数的增长，同时我们会有一个庞大的类层次。<br />
<br />
装饰模式使我们从这种情景中解脱出来，装饰模式推荐通过对象的合成而不是继承来包装一个对象扩展它的功能。<br />
应用装饰模式，让我们为Logger Utility定义一个有下列特征的默认根装饰类LoggerDecorator：</span></span></span></span></p>
<p><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">（1） LoggerDecorator包括一个Logger实例的引用。这个引用指向它包含的Logger对象。<br />
（2） LoggerDecorator实现Logger借口、提供Log方法的基本的默认实现，他只是简单的转发调用给它包含的Logger 对象。每一个LoggerDecorator子类保证定义log方法。</span></span></span></span></p>
<p><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">Listing 19.1: LoggerDecorator Class</span></span></span></span></p>
<div class="codeStyle">
<ol>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">class</font></strong> LoggerDecorator <strong><font color="#0000ff">implements</font></strong> <font color="#ff0000">Logger</font> { </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><font color="#ff0000">Logger</font> logger; </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><strong><font color="#0000ff">public</font></strong> LoggerDecorator(<font color="#ff0000">Logger</font> inp_logger) { </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">logger = inp_logger; </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">} </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">void</font></strong> log(<strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></strong> DataLine) { </span></span></span></span>
    <li><em><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">/* </span></span></span></span></em>
    <li><em><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">Default implementation </span></span></span></span></em>
    <li><em><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">to be overriden by subclasses. </span></span></span></span></em>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><em><font color="#339900">*/</font></em> </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">logger.log(DataLine); </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">} </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">}<em><font color="#339900">//end of class </font></em></span></span></span></span></li>
</ol>
</div>
<p><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">每一个logger的装饰定义log方法使很重要的，因为装饰对象必须提供和它包装的对象相同的借口。当客户端创建一个装饰类的实例，客户端以与装饰类交互方式和客户端与拥有相同接口原对象的交互方式是一致的。<br />
让我们定义LoggerDecorator的两个子类，HTMLLogger和EncryptLogger。 #p# <strong>具体的Logger 装饰类</strong> </span></span></span></span></p>
<h5><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">HTMLLogger</span></span></span></span></h5>
<p><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">HTMLLogger重载了log方法的默认实现。在log方法中，装饰类把出力信息转化为HTML文档，并且发送给可以出力的Logger实例。<br />
Listing 19.2: HTMLLogger Class <br />
</span></span></span></span></p>
<div class="codeStyle">
<ol>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">class</font></strong> HTMLLogger <strong><font color="#0000ff">extends</font></strong> LoggerDecorator { </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><strong><font color="#0000ff">public</font></strong> HTMLLogger(<font color="#ff0000">Logger</font> inp_logger) { </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><strong><font color="#0000ff">super</font></strong>(inp_logger); </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">} </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">void</font></strong> log(<strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></strong> DataLine) { </span></span></span></span>
    <li><em><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">/* </span></span></span></span></em>
    <li><em><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">Added functionality </span></span></span></span></em>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><em><font color="#339900">*/</font></em> </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">DataLine = makeHTML(DataLine); </span></span></span></span>
    <li><em><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">/* </span></span></span></span></em>
    <li><em><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">Now forward the encrypted text to the FileLogger </span></span></span></span></em>
    <li><em><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">for storage </span></span></span></span></em>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><em><font color="#339900">*/</font></em> </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">logger.log(DataLine); </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">} </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><strong><font color="#0000ff">public</font></strong> <strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></strong> makeHTML(<strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></strong> DataLine) { </span></span></span></span>
    <li><em><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">/* </span></span></span></span></em>
    <li><em><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">Make it into an HTML document. </span></span></span></span></em>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><em><font color="#339900">*/</font></em> </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">DataLine = <font color="#ff33ff">""</font> + <font color="#ff33ff">"<strong>"</strong>"</font> + DataLine + </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><font color="#ff33ff">"</font> + <font color="#ff33ff">""</font>; </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><strong><font color="#0000ff">return</font></strong> DataLine; </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">} </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">}<em><font color="#339900">//end of class </font></em></span></span></span></span></li>
</ol>
</div>
<h5><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">EncryptLogger</span></span></span></span></h5>
<p><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">与HTMLLogger相似，EncryptLogger重载了log方法，在log方法中，EncryptLogger通过简单的将字符位置向右转移一位实现了加密逻辑，并且发送给可以出力的Logger实例。<br />
<br />
Listing 19.3: EncryptLogger Class <br />
</span></span></span></span></p>
<div class="codeStyle">
<ol>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">class</font></strong> EncryptLogger <strong><font color="#0000ff">extends</font></strong> LoggerDecorator { </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><strong><font color="#0000ff">public</font></strong> EncryptLogger(<font color="#ff0000">Logger</font> inp_logger) { </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><strong><font color="#0000ff">super</font></strong>(inp_logger); </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">} </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">void</font></strong> log(<strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></strong> DataLine) { </span></span></span></span>
    <li><em><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">/* </span></span></span></span></em>
    <li><em><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">Added functionality </span></span></span></span></em>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><em><font color="#339900">*/</font></em> </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">DataLine = encrypt(DataLine); </span></span></span></span>
    <li><em><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">/* </span></span></span></span></em>
    <li><em><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">Now forward the encrypted text to the FileLogger </span></span></span></span></em>
    <li><em><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">for storage </span></span></span></span></em>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><em><font color="#339900">*/</font></em> </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">logger.log(DataLine); </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">} </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><strong><font color="#0000ff">public</font></strong> <strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></strong> encrypt(<strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></strong> DataLine) { </span></span></span></span>
    <li><em><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">/* </span></span></span></span></em>
    <li><em><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">Apply simple encryption by Transposition&#8230; </span></span></span></span></em>
    <li><em><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">Shift all characters by one position. </span></span></span></span></em>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><em><font color="#339900">*/</font></em> </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">DataLine = DataLine.substring(DataLine.<strong><font color="#0000ff">length</font></strong>() &#8722; 1) + </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">DataLine.substring(0, DataLine.<strong><font color="#0000ff">length</font></strong>() &#8722; 1); </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><strong><font color="#0000ff">return</font></strong> DataLine; </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">} </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">}<em><font color="#339900">//end of class </font></em></span></span></span></span></li>
</ol>
</div>
<h4><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">为了使用新设计装饰对象，客户端需要：</span></span></span></span></h4>
<p><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">（1） 使用LoggerFactory工厂方法创建一个合适的Logger实例（FileLogger/ConsoleLogger）。<br />
（2） 把第一步中创建的Logger实例作为参数转递给新创建的合适的LoggerDecorator实例的构造函数。<br />
（3） 调用LoggerDecorator实例上的方法，</span></span></span></span></p>
<p><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">Listing 19.4: Client DecoratorClient Class</span></span></span></span></p>
<div class="codeStyle">
<ol>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><strong><font color="#0000ff">class</font></strong> DecoratorClient { </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">static</font></strong> <strong><font color="#0000ff">void</font></strong> main(<strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></strong>[] args) { </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">LoggerFactory factory = <strong><font color="#0000ff">new</font></strong> LoggerFactory(); </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt"><font color="#ff0000">Logger</font> logger = factory.getLogger(); </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">HTMLLogger hLogger = <strong><font color="#0000ff">new</font></strong> HTMLLogger(logger); </span></span></span></span>
    <li><em><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">//the decorator object provides the same interface. </span></span></span></span></em>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">hLogger.log(<font color="#ff33ff">"A Message to Log"</font>); </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">EncryptLogger eLogger = <strong><font color="#0000ff">new</font></strong> EncryptLogger(logger); </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">eLogger.log(<font color="#ff33ff">"A Message to Log"</font>); </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">} </span></span></span></span>
    <li><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">}<em><font color="#339900">//End of class </font></em></span></span></span></span></li>
</ol>
</div>
<h3><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">增加新的信息出力类型</span></span></span></span></h3>
<p><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">在Logging Utility实例中，应用装饰模式对比使用继承不会因为类层次的增长而导致大量的子类，我们还有另外的Logger类型：DBLogger??出力信息到数据库中。为了将信息转化HTML格式或在出力到数据库以前对信息进行加密，客户端只需遵从上面提到的步骤，因为DBLogger是一种Logger类型，它可以作为构造函数的参数传递给HTMLLogger或EncryptLogger中任何一个类。<br />
</span></span></span></span></p>
<h3><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">增加新的装饰</span></span></span></span></h3>
<p><span style="font-family: 幼圆"><span style="font-size: 12pt"><span style="font-family: 幼圆"><span style="font-size: 10pt">从例子中可以看到，LoggerDecorator实例包含了一个Logger类型了对象实例，在转发请求给Logger对象实例以前或以后，增加新的功能。因为LoggerDecorator类实现了Logger接口，LoggerDecorator实例或它的任何一个子类都可以作为一个Logger类型。因此LoggerDecortator包含它的任何子类的一个实例，并且将请求转发给它/。一般的一个装饰对象可以包含另一个装饰对象，并且可以向它转发请求。通过这种方式，新的装饰类，新的功能可以通过包装现存的装饰类来实现。</span></span></span></span></p>
<img src ="http://www.blogjava.net/thisliy/aggbug/300543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/thisliy/" target="_blank">liyang</a> 2009-11-01 10:38 <a href="http://www.blogjava.net/thisliy/archive/2009/11/01/300543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单例模式完全剖析</title><link>http://www.blogjava.net/thisliy/archive/2009/10/26/299810.html</link><dc:creator>liyang</dc:creator><author>liyang</author><pubDate>Mon, 26 Oct 2009 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/thisliy/archive/2009/10/26/299810.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 概要&nbsp;单例模式是最简单的设计模式之一，但是对于Java的开发者来说，它却有很多缺陷。在本月的专栏中，David Geary探讨了单例模式以及在面对多线程（multithreading)、类装载器（classloaders）和序列化(serialization)时如何处理这些缺陷。&nbsp;单例模式适合于一个类只有一个实例的情况，比如窗口管理器，打印缓冲池和文件系统，它们都是...&nbsp;&nbsp;<a href='http://www.blogjava.net/thisliy/archive/2009/10/26/299810.html'>阅读全文</a><img src ="http://www.blogjava.net/thisliy/aggbug/299810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/thisliy/" target="_blank">liyang</a> 2009-10-26 16:58 <a href="http://www.blogjava.net/thisliy/archive/2009/10/26/299810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java动态代理实例</title><link>http://www.blogjava.net/thisliy/archive/2009/10/24/299621.html</link><dc:creator>liyang</dc:creator><author>liyang</author><pubDate>Sat, 24 Oct 2009 13:44:00 GMT</pubDate><guid>http://www.blogjava.net/thisliy/archive/2009/10/24/299621.html</guid><wfw:comment>http://www.blogjava.net/thisliy/comments/299621.html</wfw:comment><comments>http://www.blogjava.net/thisliy/archive/2009/10/24/299621.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/thisliy/comments/commentRss/299621.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/thisliy/services/trackbacks/299621.html</trackback:ping><description><![CDATA[1.真实对象接口<br />
<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>&nbsp;<span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;IAnimal&nbsp;{<br />
</span><span style="color: #008080">2</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;info();<br />
</span><span style="color: #008080">3</span>&nbsp;<span style="color: #000000">}</span></div>
<br />
2.真实类<br />
<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>&nbsp;<span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Cat&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;IAnimal{<br />
</span><span style="color: #008080">2</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">3</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;info()&nbsp;{<br />
</span><span style="color: #008080">4</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">This&nbsp;is&nbsp;a&nbsp;cat!</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">5</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">6</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">7</span>&nbsp;<span style="color: #000000">}</span></div>
<br />
3.调用处理器<br />
<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">&nbsp;1</span>&nbsp;<span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.reflect.InvocationHandler;<br />
</span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.reflect.Method;<br />
</span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TraceHandler&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;InvocationHandler{<br />
</span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Object&nbsp;target;</span><span style="color: #008000">//</span><span style="color: #008000">以真实角色作为代理角色的属性<br />
</span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">构造器</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;TraceHandler(Object&nbsp;target)&nbsp;{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.target&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;target;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000"><br />
</span><span style="color: #008080">14</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;通过反射机制动态执行真实角色的每一个方法<br />
</span><span style="color: #008080">15</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #008080">16</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;invoke(Object&nbsp;proxy,&nbsp;Method&nbsp;method,&nbsp;Object[]&nbsp;args)<br />
</span><span style="color: #008080">17</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Throwable&nbsp;{<br />
</span><span style="color: #008080">18</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />
</span><span style="color: #008080">19</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">被拦截的方法:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;method.getName());&nbsp;<br />
</span><span style="color: #008080">20</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">预处理<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">21</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">22</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;method.invoke(target,&nbsp;args);</span><span style="color: #008000">//</span><span style="color: #008000">调用真是对象的method方法</span><span style="color: #008000"><br />
</span><span style="color: #008080">23</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">24</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
</span><span style="color: #008080">25</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
</span><span style="color: #008080">26</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">finally</span><span style="color: #000000">&nbsp;{<br />
</span><span style="color: #008080">27</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">善后处理<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">28</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">29</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">30</span>&nbsp;<span style="color: #000000">}</span></div>
<br />
4.客户端<br />
<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">&nbsp;1</span>&nbsp;<span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.reflect.InvocationHandler;<br />
</span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.reflect.Proxy;<br />
</span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ProxyTest&nbsp;{<br />
</span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
</span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">真实对象（即被代理对象）</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;IAnimal&nbsp;animal&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Cat();<br />
</span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">为真实对象制定一个调用处理器</span><span style="color: #008000"><br />
</span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InvocationHandler&nbsp;handler&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TraceHandler(animal);<br />
</span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">获得真实对象(animal)的一个代理类&nbsp;★★★★★</span><span style="color: #008000"><br />
</span><span style="color: #008080">14</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;proxyObj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Proxy.newProxyInstance(<br />
</span><span style="color: #008080">15</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;animal.getClass().getClassLoader(),&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">真实对象的类加载器</span><span style="color: #008000"><br />
</span><span style="color: #008080">16</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;animal.getClass().getInterfaces(),&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">真实对象实现的所有接口</span><span style="color: #008000"><br />
</span><span style="color: #008080">17</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handler&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;</span><span style="color: #008000">//</span><span style="color: #008000">真实对象的处理器</span><span style="color: #008000"><br />
</span><span style="color: #008080">18</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />
</span><span style="color: #008080">19</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">20</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(proxyObj&nbsp;</span><span style="color: #0000ff">instanceof</span><span style="color: #000000">&nbsp;IAnimal)&nbsp;{<br />
</span><span style="color: #008080">21</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">the&nbsp;proxyObj&nbsp;is&nbsp;an&nbsp;animal!</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">22</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">23</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IAnimal&nbsp;animalProxy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(IAnimal)proxyObj;</span><span style="color: #008000">//</span><span style="color: #008000">proxyObj与animal都实现了IAnimal接口</span><span style="color: #008000"><br />
</span><span style="color: #008080">24</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">25</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;animalProxy.info();</span><span style="color: #008000">//</span><span style="color: #008000">像普通animal对象一样使用(通过handler的invoke方法执行)</span><span style="color: #008000"><br />
</span><span style="color: #008080">26</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />
</span><span style="color: #008080">27</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">the&nbsp;proxyObj&nbsp;isn't&nbsp;an&nbsp;animal!</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">28</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">29</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">30</span>&nbsp;<span style="color: #000000">}</span></div>
<img src ="http://www.blogjava.net/thisliy/aggbug/299621.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/thisliy/" target="_blank">liyang</a> 2009-10-24 21:44 <a href="http://www.blogjava.net/thisliy/archive/2009/10/24/299621.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA代理模式</title><link>http://www.blogjava.net/thisliy/archive/2009/10/24/299585.html</link><dc:creator>liyang</dc:creator><author>liyang</author><pubDate>Sat, 24 Oct 2009 12:54:00 GMT</pubDate><guid>http://www.blogjava.net/thisliy/archive/2009/10/24/299585.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 代理模式 代理模式的作用是：为其他对象提供一种代理以控制对这个对象的访问。在某些情况下，一个客户不想或者不能直接引用另一个对象，而代理对象可以在客户端和目标对象之间起到中介的作用。代理模式一般涉及到的角色有：抽象角色：声明真实对象和代理对象的共同接口；代理角色：代理对象角色内部含有对真实对象的引用，从而可以操作真实对象，同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实...&nbsp;&nbsp;<a href='http://www.blogjava.net/thisliy/archive/2009/10/24/299585.html'>阅读全文</a><img src ="http://www.blogjava.net/thisliy/aggbug/299585.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/thisliy/" target="_blank">liyang</a> 2009-10-24 20:54 <a href="http://www.blogjava.net/thisliy/archive/2009/10/24/299585.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>