﻿<?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-Xiaobo Sun -随笔分类-Design Pattern</title><link>http://www.blogjava.net/sunxiaobo/category/36695.html</link><description>Eclipse-Unix
http://umlfact.berlios.de/~s_xsun/</description><language>zh-cn</language><lastBuildDate>Sun, 14 Dec 2008 12:30:09 GMT</lastBuildDate><pubDate>Sun, 14 Dec 2008 12:30:09 GMT</pubDate><ttl>60</ttl><item><title>Design Pattern: delegation</title><link>http://www.blogjava.net/sunxiaobo/archive/2008/12/14/246232.html</link><dc:creator>Xiaobo Sun</dc:creator><author>Xiaobo Sun</author><pubDate>Sun, 14 Dec 2008 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/sunxiaobo/archive/2008/12/14/246232.html</guid><wfw:comment>http://www.blogjava.net/sunxiaobo/comments/246232.html</wfw:comment><comments>http://www.blogjava.net/sunxiaobo/archive/2008/12/14/246232.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunxiaobo/comments/commentRss/246232.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunxiaobo/services/trackbacks/246232.html</trackback:ping><description><![CDATA[&nbsp;<span class="kw2">class</span> A <span class="br0">{<br />
</span>&nbsp;&nbsp;&nbsp; &nbsp;<span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw3">System</span>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">(</span><span class="st0">"A: doing f()"</span><span class="br0">)</span>; <span class="br0">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp; <span class="kw4">void</span> g<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw3">System</span>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">(</span><span class="st0">"A: doing g()"</span><span class="br0">)</span>; <span class="br0">}</span><br />
<span class="br0">}</span><br />
<br />
<span class="kw2">class</span> C <span class="br0">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp; <span class="co1">// delegation</span><br />
&nbsp;&nbsp;&nbsp;&nbsp; A a = <span class="kw2">new</span> A<span class="br0">(</span><span class="br0">)</span>;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; <span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> a.<span class="me1">f</span><span class="br0">(</span><span class="br0">)</span>; <span class="br0">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp; <span class="kw4">void</span> g<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> a.<span class="me1">g</span><span class="br0">(</span><span class="br0">)</span>; <span class="br0">}</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; <span class="co1">// normal attributes</span><br />
&nbsp;&nbsp;&nbsp;&nbsp; X x = <span class="kw2">new</span> X<span class="br0">(</span><span class="br0">)</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <span class="kw4">void</span> y<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="coMULTI">/* do stuff */</span> <span class="br0">}</span><br />
<span class="br0">}</span><br />
<br />
<span class="kw2">public</span> <span class="kw2">class</span> Main <span class="br0">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp; <span class="kw2">public</span> <span class="kw2">static</span> <span class="kw4">void</span> main<span class="br0">(</span><span class="kw3">String</span><span class="br0">[</span><span class="br0">]</span> args<span class="br0">)</span> <span class="br0">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C c = <span class="kw2">new</span> C<span class="br0">(</span><span class="br0">)</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.<span class="me1">f</span><span class="br0">(</span><span class="br0">)</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.<span class="me1">g</span><span class="br0">(</span><span class="br0">)</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <span class="br0">}</span><br />
<span class="br0">}</span>
 <img src ="http://www.blogjava.net/sunxiaobo/aggbug/246232.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunxiaobo/" target="_blank">Xiaobo Sun</a> 2008-12-14 16:34 <a href="http://www.blogjava.net/sunxiaobo/archive/2008/12/14/246232.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Design Pattern: Proxy, dynamic Proxy</title><link>http://www.blogjava.net/sunxiaobo/archive/2008/12/14/246230.html</link><dc:creator>Xiaobo Sun</dc:creator><author>Xiaobo Sun</author><pubDate>Sun, 14 Dec 2008 08:21:00 GMT</pubDate><guid>http://www.blogjava.net/sunxiaobo/archive/2008/12/14/246230.html</guid><wfw:comment>http://www.blogjava.net/sunxiaobo/comments/246230.html</wfw:comment><comments>http://www.blogjava.net/sunxiaobo/archive/2008/12/14/246230.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunxiaobo/comments/commentRss/246230.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunxiaobo/services/trackbacks/246230.html</trackback:ping><description><![CDATA[<p><strong>代理模式</strong></p>
<p>&nbsp;Proxy Pattern's 3 roles：</p>
<p>1.&nbsp; (abstract common)Subject：common interface</p>
<p>2.&nbsp; ProxySubject：含有the reference to the RealSubject //delegation</p>
<p>3.&nbsp; RealSubject：实现逻辑的类</p>
<p>类图如下：</p>
<p><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/Jackiezhw/未标题-1.jpg" /></p>
<p>图1<img height="202" alt="" src="http://www.blogjava.net/images/blogjava_net/sunxiaobo/proxy.jpg" width="659" border="0" /></p>
<p>Java 动态代理</p>
<p>从JDK1.3开始，Java就引入了动态代理的概念。动态代理（Dynamic Proxy）可以帮助你减少代码行数，真正提高代码的可复用度。</p>
<p>&nbsp;类图如下：</p>
<p><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/Jackiezhw/未标题-23.jpg" /></p>
<p>图2&nbsp;<img height="422" alt="" src="http://www.blogjava.net/images/blogjava_net/sunxiaobo/dynamic_proxy.jpg" width="572" border="0" /></p>
<p>动态代理和普通的代理模式的区别，就是动态代理中的代理类是由java.lang.reflect.Proxy类在运行期时根据接口定义，采用Java反射功能动态生成的(图2的匿名实现类)。和java.lang.reflect.InvocationHandler结合，可以加强现有类的方法实现。如图2，图中的自定义Handler实现InvocationHandler接口，自定义Handler实例化时，将实现类传入自定义Handler对象。自定义Handler需要实现invoke方法，该方法可以使用Java反射调用实现类的实现的方法，同时当然可以实现其他功能，例如在调用实现类方法前后加入Log。而Proxy类根据Handler和需要代理的接口动态生成一个接口实现类的对象。当用户调用这个动态生成的实现类时，实际上是调用了自定义Handler的invoke方法。</p>
<p>下面是使用动态代理的步骤：</p>
<p>1.&nbsp; Client向Proxy请求一个具有某个功能的实例；</p>
<p>2.&nbsp; Proxy根据Subject，以自定义Handler创建一个匿名内部类，并返回给Client；</p>
<p>3.&nbsp; Client获取该匿名内部类的引用，调用在Subject接口种定义的方法；</p>
<p>4.&nbsp; 匿名内部类将对方法的调用转换为对自定义Handler中invoke方法的调用</p>
<p>5. invoke方法根据一些规则做处理，如记录log，然后调用SubjectImpl中的方法<br />
<br />
<a name="examples">&nbsp; </p>
<h2>Examples </h2>
<p></a>&nbsp;</p>
<blockquote>
<p>Here is a simple example that prints out a message before and after a method invocation on an object that implements an arbitrary list of interfaces:
<pre>public interface Foo {
Object bar(Object obj) throws BazException;
}
public class FooImpl implements Foo {
Object bar(Object obj) throws BazException {
// ...
}
}
public class DebugProxy implements java.lang.reflect.InvocationHandler {
private Object obj;
public static Object newInstance(Object obj) {
return java.lang.reflect.Proxy.newProxyInstance(
obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
new DebugProxy(obj));
}
private DebugProxy(Object obj) {
this.obj = obj;
}
public Object invoke(Object proxy, Method m, Object[] args)
throws Throwable
{
Object result;
try {
System.out.println("before method " + m.getName());
result = m.invoke(obj, args);
} catch (InvocationTargetException e) {
throw e.getTargetException();
} catch (Exception e) {
throw new RuntimeException("unexpected invocation exception: " +
e.getMessage());
} finally {
System.out.println("after method " + m.getName());
}
return result;
}
}
</pre>
<p>To construct a <code>DebugProxy</code> for an implementation of the <code>Foo</code> interface and call one of its methods:
<pre>    Foo foo = (Foo) DebugProxy.newInstance(new FooImpl());
foo.bar(null);
</pre>
</blockquote>
<p><br />
&nbsp;</p>
 <img src ="http://www.blogjava.net/sunxiaobo/aggbug/246230.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunxiaobo/" target="_blank">Xiaobo Sun</a> 2008-12-14 16:21 <a href="http://www.blogjava.net/sunxiaobo/archive/2008/12/14/246230.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IAdaptable &amp; IAdapterFactory</title><link>http://www.blogjava.net/sunxiaobo/archive/2007/06/12/123679.html</link><dc:creator>Xiaobo Sun</dc:creator><author>Xiaobo Sun</author><pubDate>Tue, 12 Jun 2007 10:06:00 GMT</pubDate><guid>http://www.blogjava.net/sunxiaobo/archive/2007/06/12/123679.html</guid><wfw:comment>http://www.blogjava.net/sunxiaobo/comments/123679.html</wfw:comment><comments>http://www.blogjava.net/sunxiaobo/archive/2007/06/12/123679.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunxiaobo/comments/commentRss/123679.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunxiaobo/services/trackbacks/123679.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在Eclipse中使用IAdaptable接口的方式有两种1：某个类希望提供新的接口，但又不希望将其暴露在API中，在这种情况下，IAdaptable接口中的方法getAdaptor()方法将由本类实现。（希望支持新的接口，而又不想把已经发布的API造成影响，这种机制很有用）2：外界要求某个类提供新的服务，这种情况下不需要修改现有类的代码，getAdaptor（）由一个工厂提供。（不使用d...&nbsp;&nbsp;<a href='http://www.blogjava.net/sunxiaobo/archive/2007/06/12/123679.html'>阅读全文</a><img src ="http://www.blogjava.net/sunxiaobo/aggbug/123679.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunxiaobo/" target="_blank">Xiaobo Sun</a> 2007-06-12 18:06 <a href="http://www.blogjava.net/sunxiaobo/archive/2007/06/12/123679.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>