??xml version="1.0" encoding="utf-8" standalone="yes"?>国产黄在线看,欧美日韩福利视频,久久99国产精品久久99大师http://www.aygfsteel.com/thisliy/category/42334.htmlzh-cnThu, 05 Nov 2009 16:35:25 GMTThu, 05 Nov 2009 16:35:25 GMT60Java装饰模式http://www.aygfsteel.com/thisliy/archive/2009/11/01/300543.htmlliyangliyangSun, 01 Nov 2009 02:38:00 GMThttp://www.aygfsteel.com/thisliy/archive/2009/11/01/300543.htmlhttp://www.aygfsteel.com/thisliy/comments/300543.htmlhttp://www.aygfsteel.com/thisliy/archive/2009/11/01/300543.html#Feedback0http://www.aygfsteel.com/thisliy/comments/commentRss/300543.htmlhttp://www.aygfsteel.com/thisliy/services/trackbacks/300543.html说明Q?/span>         装饰模式是在不必改变原类文g和用承的情况下,动态的扩展一个对象的功能。它是通过创徏一个包装对象,也就是装饰来包裹真实的对象?br />         

装饰模式的特点;

Q?Q?装饰对象和真实对象有相同的接口。这样客L对象可以以和真实对象相同的方式和装饰对象交互?br /> Q?Q?装饰对象包含一个真实对象的索引QreferenceQ?br /> Q?Q?装饰对象接受所有的来自客户端的h。它把这些请求{发给真实的对象?br /> Q?Q?装饰对象可以在{发这些请求以前或以后增加一些附加功能。这样就保了在q行Ӟ不用修改l定对象的结构就可以在外部增加附加的功能。在面向对象的设计中Q通常是通过l承来实现对l定cȝ功能扩展?br />

装饰模式 VS l承

 装饰模式                                                                 l承
用来扩展特定对象的功?nbsp;                    用来扩展一cd象的功能
不需要子c?nbsp;                                            需要子c?br /> 动态地                                                     静态地
q行时分配职?nbsp;                                    ~译时分z职?br /> 防止׃子类而导致的复杂和؜?nbsp;    D很多子类产生Q在一些场合,报漏cȝ层次
更多的灵zL?nbsp;                                        ~Z灉|?br />

例子Q?/span>

        让我们重新返回我们在工厂Ҏ和单例模式log实用工具上,我们的模式主要由Logger 接口和两个它的实现类??FileLogger和ConsoleLogger??分别把信息出力到一个文件和屏幕中。另外,q有包括工厂Ҏ的LoggerFactorycR?br /> LoggerFactory没有出现在下图中Q主要是因ؓ它和现在讨论的例子没有直接联pR?br />
让我们想象一些客L需要以出Logger Utility现在所提供的新的方式出力信息,客户端需要下面两U特征;
Q?Q?把出力的信息传唤为HTML文档
Q?Q?对出力信息进行逻辑转化的简单加密,在面向对象的设计中,不改变现存的cȝ代码Q可以应用承来增加新的功能。例如,子类化现在的c重载它的方法来增加所需要的新功能?/span>

应用l承Q我们要子类化FileLogger和ConsoleLoggercL增加新的功能Q会有下面的一l新的子c:
子类 父类 功能
HTMLFileLogger FileLogger 转化出力信息为HTML文Qƈ存入一个Log文g
HTMLConsLogger ConsoleLogger 转化出力信息为HTML文Qƈ昄在屏q上
EncFileLogger FileLogger 加密出力信息Qƈ存入一个Log文g
EncConsLogger ConsoleLogger 加密出力信息Qƈ昄在屏q上

从类囑֏以看刎ͼZ实现新的功能加入了一l新的子cR如果我们还有其他的LoggercdQ例如:DBLogger出力信息到数据库中)Q这样会有更多子cR当一个新的特性需要被加入Q子cȝ数量会有成倍数的增长,同时我们会有一个庞大的cdơ?br />
装饰模式使我们从q种情景中解脱出来,装饰模式推荐通过对象的合成而不是承来包装一个对象扩展它的功能?br /> 应用装饰模式Q让我们为Logger Utility定义一个有下列特征的默认根装饰cLoggerDecoratorQ?/span>

Q?Q?LoggerDecorator包括一个Logger实例的引用。这个引用指向它包含的Logger对象?br /> Q?Q?LoggerDecorator实现Logger借口、提供LogҎ的基本的默认实现Q他只是单的转发调用l它包含的Logger 对象。每一个LoggerDecorator子类保证定义logҎ?/span>

Listing 19.1: LoggerDecorator Class

  1. public class LoggerDecorator implements Logger {
  2. Logger logger;
  3. public LoggerDecorator(Logger inp_logger) {
  4. logger = inp_logger;
  5. }
  6. public void log(String DataLine) {
  7. /*
  8. Default implementation
  9. to be overriden by subclasses.
  10. */
  11. logger.log(DataLine);
  12. }
  13. }//end of class

每一个logger的装饰定义logҎ使很重要的,因ؓ装饰对象必须提供和它包装的对象相同的借口。当客户端创Z个装饰类的实例,客户端以与装饰类交互方式和客L与拥有相同接口原对象的交互方式是一致的?br /> 让我们定义LoggerDecorator的两个子c,HTMLLogger和EncryptLogger?#p# 具体的Logger 装饰c?/strong>

HTMLLogger

HTMLLogger重蝲了logҎ的默认实现。在logҎ中,装饰cL出力信息转化为HTML文档Qƈ且发送给可以出力的Logger实例?br /> Listing 19.2: HTMLLogger Class

  1. public class HTMLLogger extends LoggerDecorator {
  2. public HTMLLogger(Logger inp_logger) {
  3. super(inp_logger);
  4. }
  5. public void log(String DataLine) {
  6. /*
  7. Added functionality
  8. */
  9. DataLine = makeHTML(DataLine);
  10. /*
  11. Now forward the encrypted text to the FileLogger
  12. for storage
  13. */
  14. logger.log(DataLine);
  15. }
  16. public String makeHTML(String DataLine) {
  17. /*
  18. Make it into an HTML document.
  19. */
  20. DataLine = "" + """ + DataLine +
  21. " + "";
  22. return DataLine;
  23. }
  24. }//end of class
EncryptLogger

与HTMLLogger怼QEncryptLogger重蝲了logҎQ在logҎ中,EncryptLogger通过单的字W位|向双{UM位实C加密逻辑Qƈ且发送给可以出力的Logger实例?br />
Listing 19.3: EncryptLogger Class

  1. public class EncryptLogger extends LoggerDecorator {
  2. public EncryptLogger(Logger inp_logger) {
  3. super(inp_logger);
  4. }
  5. public void log(String DataLine) {
  6. /*
  7. Added functionality
  8. */
  9. DataLine = encrypt(DataLine);
  10. /*
  11. Now forward the encrypted text to the FileLogger
  12. for storage
  13. */
  14. logger.log(DataLine);
  15. }
  16. public String encrypt(String DataLine) {
  17. /*
  18. Apply simple encryption by Transposition…
  19. Shift all characters by one position.
  20. */
  21. DataLine = DataLine.substring(DataLine.length() − 1) +
  22. DataLine.substring(0, DataLine.length() − 1);
  23. return DataLine;
  24. }
  25. }//end of class

Z使用新设计装饰对象,客户端需要:

Q?Q?使用LoggerFactory工厂Ҏ创徏一个合适的Logger实例QFileLogger/ConsoleLoggerQ?br /> Q?Q?把第一步中创徏的Logger实例作ؓ参数转递给新创建的合适的LoggerDecorator实例的构造函数?br /> Q?Q?调用LoggerDecorator实例上的ҎQ?/span>

Listing 19.4: Client DecoratorClient Class

  1. class DecoratorClient {
  2. public static void main(String[] args) {
  3. LoggerFactory factory = new LoggerFactory();
  4. Logger logger = factory.getLogger();
  5. HTMLLogger hLogger = new HTMLLogger(logger);
  6. //the decorator object provides the same interface.
  7. hLogger.log("A Message to Log");
  8. EncryptLogger eLogger = new EncryptLogger(logger);
  9. eLogger.log("A Message to Log");
  10. }
  11. }//End of class

增加新的信息出力cd

在Logging Utility实例中,应用装饰模式Ҏ使用l承不会因ؓcdơ的增长而导致大量的子类Q我们还有另外的LoggercdQDBLogger??出力信息到数据库中。ؓ了将信息转化HTML格式或在出力到数据库以前对信息进行加密,客户端只需遵从上面提到的步骤,因ؓDBLogger是一ULoggercdQ它可以作ؓ构造函数的参数传递给HTMLLogger或EncryptLogger中Q何一个类?br />

增加新的装饰

从例子中可以看到QLoggerDecorator实例包含了一个Loggercd了对象实例,在{发请求给Logger对象实例以前或以后,增加新的功能。因为LoggerDecoratorcdCLogger接口QLoggerDecorator实例或它的Q何一个子c都可以作ؓ一个Loggercd。因此LoggerDecortator包含它的M子类的一个实例,q且请求{发给?。一般的一个装饰对象可以包含另一个装饰对象,q且可以向它转发h。通过q种方式Q新的装饰类Q新的功能可以通过包装现存的装饰类来实现?/span>



liyang 2009-11-01 10:38 发表评论
]]>
单例模式完全剖析http://www.aygfsteel.com/thisliy/archive/2009/10/26/299810.htmlliyangliyangMon, 26 Oct 2009 08:58:00 GMThttp://www.aygfsteel.com/thisliy/archive/2009/10/26/299810.html阅读全文

liyang 2009-10-26 16:58 发表评论
]]>
java动态代理实?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/thisliy/archive/2009/10/24/299621.html</guid><wfw:comment>http://www.aygfsteel.com/thisliy/comments/299621.html</wfw:comment><comments>http://www.aygfsteel.com/thisliy/archive/2009/10/24/299621.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/thisliy/comments/commentRss/299621.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/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> <span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">interface</span><span style="color: #000000"> IAnimal {<br /> </span><span style="color: #008080">2</span> <span style="color: #000000">    </span><span style="color: #0000ff">void</span><span style="color: #000000"> info();<br /> </span><span style="color: #008080">3</span> <span style="color: #000000">}</span></div> <br /> 2.真实c?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> <span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> Cat </span><span style="color: #0000ff">implements</span><span style="color: #000000"> IAnimal{<br /> </span><span style="color: #008080">2</span> <span style="color: #000000"><br /> </span><span style="color: #008080">3</span> <span style="color: #000000">    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> info() {<br /> </span><span style="color: #008080">4</span> <span style="color: #000000">        System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">This is a cat!</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> </span><span style="color: #008080">5</span> <span style="color: #000000">    }<br /> </span><span style="color: #008080">6</span> <span style="color: #000000"><br /> </span><span style="color: #008080">7</span> <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"> 1</span> <span style="color: #0000ff">import</span><span style="color: #000000"> java.lang.reflect.InvocationHandler;<br /> </span><span style="color: #008080"> 2</span> <span style="color: #0000ff">import</span><span style="color: #000000"> java.lang.reflect.Method;<br /> </span><span style="color: #008080"> 3</span> <span style="color: #000000"><br /> </span><span style="color: #008080"> 4</span> <span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> TraceHandler </span><span style="color: #0000ff">implements</span><span style="color: #000000"> InvocationHandler{<br /> </span><span style="color: #008080"> 5</span> <span style="color: #000000">    <br /> </span><span style="color: #008080"> 6</span> <span style="color: #000000">    </span><span style="color: #0000ff">private</span><span style="color: #000000"> Object target;</span><span style="color: #008000">//</span><span style="color: #008000">以真实角色作Z理角色的属?br /> </span><span style="color: #008080"> 7</span> <span style="color: #008000">    <br /> </span><span style="color: #008080"> 8</span> <span style="color: #008000">    </span><span style="color: #008000">//</span><span style="color: #008000">构造器</span><span style="color: #008000"><br /> </span><span style="color: #008080"> 9</span> <span style="color: #000000">    </span><span style="color: #0000ff">public</span><span style="color: #000000"> TraceHandler(Object target) {   <br /> </span><span style="color: #008080">10</span> <span style="color: #000000">        </span><span style="color: #0000ff">this</span><span style="color: #000000">.target </span><span style="color: #000000">=</span><span style="color: #000000"> target;   <br /> </span><span style="color: #008080">11</span> <span style="color: #000000">    }   <br /> </span><span style="color: #008080">12</span> <span style="color: #000000"><br /> </span><span style="color: #008080">13</span> <span style="color: #000000">    </span><span style="color: #008000">/*</span><span style="color: #008000"><br /> </span><span style="color: #008080">14</span> <span style="color: #008000">     * 通过反射机制动态执行真实角色的每一个方?br /> </span><span style="color: #008080">15</span> <span style="color: #008000">     </span><span style="color: #008000">*/</span><span style="color: #000000"><br /> </span><span style="color: #008080">16</span> <span style="color: #000000">    </span><span style="color: #0000ff">public</span><span style="color: #000000"> Object invoke(Object proxy, Method method, Object[] args)<br /> </span><span style="color: #008080">17</span> <span style="color: #000000">            </span><span style="color: #0000ff">throws</span><span style="color: #000000"> Throwable {<br /> </span><span style="color: #008080">18</span> <span style="color: #000000">        </span><span style="color: #0000ff">try</span><span style="color: #000000"> {<br /> </span><span style="color: #008080">19</span> <span style="color: #000000">            System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">被拦截的Ҏ:</span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> method.getName()); <br /> </span><span style="color: #008080">20</span> <span style="color: #000000">            System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">预处?img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" />.</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> </span><span style="color: #008080">21</span> <span style="color: #000000">            <br /> </span><span style="color: #008080">22</span> <span style="color: #000000">            </span><span style="color: #0000ff">return</span><span style="color: #000000"> method.invoke(target, 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> <span style="color: #000000">            <br /> </span><span style="color: #008080">24</span> <span style="color: #000000">        } </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (Exception e) {<br /> </span><span style="color: #008080">25</span> <span style="color: #000000">            </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;<br /> </span><span style="color: #008080">26</span> <span style="color: #000000">        } </span><span style="color: #0000ff">finally</span><span style="color: #000000"> {<br /> </span><span style="color: #008080">27</span> <span style="color: #000000">             System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">善后处理<img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" />.</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> </span><span style="color: #008080">28</span> <span style="color: #000000">        }<br /> </span><span style="color: #008080">29</span> <span style="color: #000000">    }<br /> </span><span style="color: #008080">30</span> <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"> 1</span> <span style="color: #0000ff">import</span><span style="color: #000000"> java.lang.reflect.InvocationHandler;<br /> </span><span style="color: #008080"> 2</span> <span style="color: #0000ff">import</span><span style="color: #000000"> java.lang.reflect.Proxy;<br /> </span><span style="color: #008080"> 3</span> <span style="color: #000000"><br /> </span><span style="color: #008080"> 4</span> <span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> ProxyTest {<br /> </span><span style="color: #008080"> 5</span> <span style="color: #000000">    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> main(String[] args) {<br /> </span><span style="color: #008080"> 6</span> <span style="color: #000000">        <br /> </span><span style="color: #008080"> 7</span> <span style="color: #000000">        </span><span style="color: #008000">//</span><span style="color: #008000">真实对象Q即被代理对象)</span><span style="color: #008000"><br /> </span><span style="color: #008080"> 8</span> <span style="color: #000000">        </span><span style="color: #0000ff">final</span><span style="color: #000000"> IAnimal animal </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> Cat();<br /> </span><span style="color: #008080"> 9</span> <span style="color: #000000">        <br /> </span><span style="color: #008080">10</span> <span style="color: #000000">        </span><span style="color: #008000">//</span><span style="color: #008000">为真实对象制定一个调用处理器</span><span style="color: #008000"><br /> </span><span style="color: #008080">11</span> <span style="color: #000000">        InvocationHandler handler </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> TraceHandler(animal);<br /> </span><span style="color: #008080">12</span> <span style="color: #000000">        <br /> </span><span style="color: #008080">13</span> <span style="color: #000000">        </span><span style="color: #008000">//</span><span style="color: #008000">获得真实对象(animal)的一个代理类 ★★★★?/span><span style="color: #008000"><br /> </span><span style="color: #008080">14</span> <span style="color: #000000">        Object proxyObj </span><span style="color: #000000">=</span><span style="color: #000000"> Proxy.newProxyInstance(<br /> </span><span style="color: #008080">15</span> <span style="color: #000000">                animal.getClass().getClassLoader(), </span><span style="color: #008000">//</span><span style="color: #008000">真实对象的类加蝲?/span><span style="color: #008000"><br /> </span><span style="color: #008080">16</span> <span style="color: #000000">                animal.getClass().getInterfaces(),  </span><span style="color: #008000">//</span><span style="color: #008000">真实对象实现的所有接?/span><span style="color: #008000"><br /> </span><span style="color: #008080">17</span> <span style="color: #000000">                handler                                </span><span style="color: #008000">//</span><span style="color: #008000">真实对象的处理器</span><span style="color: #008000"><br /> </span><span style="color: #008080">18</span> <span style="color: #000000">                );<br /> </span><span style="color: #008080">19</span> <span style="color: #000000">         <br /> </span><span style="color: #008080">20</span> <span style="color: #000000">         </span><span style="color: #0000ff">if</span><span style="color: #000000"> (proxyObj </span><span style="color: #0000ff">instanceof</span><span style="color: #000000"> IAnimal) {<br /> </span><span style="color: #008080">21</span> <span style="color: #000000">            System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">the proxyObj is an animal!</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> </span><span style="color: #008080">22</span> <span style="color: #000000">            <br /> </span><span style="color: #008080">23</span> <span style="color: #000000">            IAnimal animalProxy </span><span style="color: #000000">=</span><span style="color: #000000"> (IAnimal)proxyObj;</span><span style="color: #008000">//</span><span style="color: #008000">proxyObj与animal都实CIAnimal接口</span><span style="color: #008000"><br /> </span><span style="color: #008080">24</span> <span style="color: #000000">            <br /> </span><span style="color: #008080">25</span> <span style="color: #000000">            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> <span style="color: #000000">        } </span><span style="color: #0000ff">else</span><span style="color: #000000"> {<br /> </span><span style="color: #008080">27</span> <span style="color: #000000">            System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">the proxyObj isn't an animal!</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> </span><span style="color: #008080">28</span> <span style="color: #000000">        }<br /> </span><span style="color: #008080">29</span> <span style="color: #000000">    }<br /> </span><span style="color: #008080">30</span> <span style="color: #000000">}</span></div> <img src ="http://www.aygfsteel.com/thisliy/aggbug/299621.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/thisliy/" target="_blank">liyang</a> 2009-10-24 21:44 <a href="http://www.aygfsteel.com/thisliy/archive/2009/10/24/299621.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA代理模式http://www.aygfsteel.com/thisliy/archive/2009/10/24/299585.htmlliyangliyangSat, 24 Oct 2009 12:54:00 GMThttp://www.aygfsteel.com/thisliy/archive/2009/10/24/299585.html阅读全文

liyang 2009-10-24 20:54 发表评论
]]>
վ֩ģ壺 | տ| | Ӣ| | ƺ| | ԭ| | | ʷ| | | ľ| | ¡| | | ̩| | | | Ϫ| | | ˫| | ƽȪ| | ҽ| | | ϳ| | | | ͭ| | | | |