﻿<?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-我的JAVA学习笔记-随笔分类-设计模式</title><link>http://www.blogjava.net/EvanLiu/category/29139.html</link><description>休息，休息</description><language>zh-cn</language><lastBuildDate>Thu, 17 Sep 2009 16:53:32 GMT</lastBuildDate><pubDate>Thu, 17 Sep 2009 16:53:32 GMT</pubDate><ttl>60</ttl><item><title>Bridge模式</title><link>http://www.blogjava.net/EvanLiu/archive/2008/02/01/178856.html</link><dc:creator>EvanLiu</dc:creator><author>EvanLiu</author><pubDate>Fri, 01 Feb 2008 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/EvanLiu/archive/2008/02/01/178856.html</guid><wfw:comment>http://www.blogjava.net/EvanLiu/comments/178856.html</wfw:comment><comments>http://www.blogjava.net/EvanLiu/archive/2008/02/01/178856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/EvanLiu/comments/commentRss/178856.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/EvanLiu/services/trackbacks/178856.html</trackback:ping><description><![CDATA[<span style="color: #0817ff">7、BRIDGE—早上碰到MM，要说早上好，晚上碰到MM，要说晚上好；碰到MM穿了件新衣服，要说你的衣服好漂亮哦，碰到MM新做的发型，要说你的头发好漂亮哦。不要问我&#8220;早上碰到MM新做了个发型怎么说&#8221;这种问题，自己用BRIDGE组合一下不就行了<br />
<br />
【GOF95】在提出桥梁模式的时候指出，桥梁模式的用意是"将抽象化(Abstraction)与实现化(Implementation)脱耦，使得二者可以独立地变化"。这句话有三个关键词，也就是抽象化、实现化和脱耦。</span><br />
<br />
<img height="251" alt="" src="http://www.blogjava.net/images/blogjava_net/evanliu/bridge.JPG" width="467" /><br />
<br />
/**<br />
&nbsp;* 抽象化角色<br />
&nbsp;*/<br />
public abstract class Abstraction {<br />
&nbsp;&nbsp; &nbsp;protected Implementor imp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;public void setImp(Implementor imp) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;this.imp = imp;<br />
&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;public void operation() {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;imp.operationImpl();<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
/**<br />
&nbsp;* 修正抽象化角色A<br />
&nbsp;*/<br />
public class <span style="color: #00ac2a">RefinedAbstractionA </span>extends Abstraction {<br />
&nbsp;&nbsp; &nbsp;public void operation() {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//improved logic<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
/**<br />
&nbsp;* 修正抽象化角色B<br />
&nbsp;*/<br />
public class <span style="color: #00ac2a">RefinedAbstractionB</span> extends Abstraction {<br />
&nbsp;&nbsp; &nbsp;public void operation() {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//improved logic<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
/**<br />
&nbsp;* 实现化角色<br />
&nbsp;*/<br />
public abstract class Implementor {<br />
&nbsp;&nbsp; &nbsp;public abstract void operationImp();<br />
}<br />
/**<br />
&nbsp;* 具体实现化角色A<br />
&nbsp;*/<br />
public class <span style="color: #ff6910">ConcreteImplementorA</span> extends Implementor {<br />
&nbsp;&nbsp; &nbsp;public void operationImp() {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println("Do something...");<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
/**<br />
&nbsp;* 具体实现化角色B<br />
&nbsp;*/<br />
public class <span style="color: #ff6910">ConcreteImplementorB</span> <span style="background-color: #ffffff"><span style="background-color: #ffffff"><span style="color: #ff6910"><span style="color: #ff6910"><span style="color: #f29216"><span style="color: #eadd1d"><span style="color: #ffbf00"><span style="color: #eadd1d"><span style="background-color: yellow"><span style="color: #ff6910"><span style="color: #ff6910"><span style="color: #f29216"><span style="color: #eadd1d"><span style="color: #ffbf00"><span style="color: #eadd1d"><span style="background-color: #ffffff"><span style="background-color: #ffffff"><span style="background-color: #ffffff"><span style="color: #ff6910"><span style="color: #ff6910"><span style="color: #f29216"><span style="color: #eadd1d"><span style="color: #ffbf00"><span style="color: #eadd1d"><span style="background-color: yellow"></span></span></span></span></span></span></span></span></span><span style="background-color: #ffffff"><span style="color: #ff6910"><span style="color: #ff6910"><span style="color: #f29216"><span style="color: #eadd1d"><span style="color: #ffbf00"><span style="color: #eadd1d"></span></span></span></span></span></span></span><span style="color: #ff6910"><span style="color: #ff6910"><span style="color: #f29216"><span style="color: #eadd1d"><span style="color: #ffbf00"></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>extends Implementor {<br />
&nbsp;&nbsp; &nbsp;public void operationImp() {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println("Do another thing...");<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
public class Client {<br />
&nbsp;&nbsp; &nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Abstraction abs = new <span style="color: #00ac2a">RefinedAbstractionA</span>();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;abs.setImp(new <span style="color: #ff6910">ConcreteImplementorA</span>());&nbsp; //等于把RefinedAbstractionA和ConcreteImplementorA组合起来了<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;abs.operation();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;abs.setImp(new <span style="color: #ff6910">ConcreteImplementorB</span>());&nbsp; //等于把RefinedAbstractionA和ConcreteImplementorB组合起来了<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;abs.operation();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//或者再换RefinedAbstractionB<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//...<br />
&nbsp;&nbsp; &nbsp;}<br />
} <br />
<!-- 广告位 -->
<script type="text/JavaScript"> 
alimama_pid="mm_10891533_910884_1874773"; 
alimama_titlecolor="0000FF"; 
alimama_descolor ="000000"; 
alimama_bgcolor="FFFFFF"; 
alimama_bordercolor="E6E6E6"; 
alimama_linkcolor="008000"; 
alimama_bottomcolor="FFFFFF"; 
alimama_anglesize="0"; 
alimama_bgpic="0"; 
alimama_icon="0"; 
alimama_sizecode="15"; 
alimama_width=950; 
alimama_height=90; 
alimama_type=2; 
</script> 
<script src="http://a.alimama.cn/inf.js" type=text/javascript> 
</script>
<img src ="http://www.blogjava.net/EvanLiu/aggbug/178856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/EvanLiu/" target="_blank">EvanLiu</a> 2008-02-01 16:20 <a href="http://www.blogjava.net/EvanLiu/archive/2008/02/01/178856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Adapter模式</title><link>http://www.blogjava.net/EvanLiu/archive/2008/01/31/178673.html</link><dc:creator>EvanLiu</dc:creator><author>EvanLiu</author><pubDate>Thu, 31 Jan 2008 06:28:00 GMT</pubDate><guid>http://www.blogjava.net/EvanLiu/archive/2008/01/31/178673.html</guid><wfw:comment>http://www.blogjava.net/EvanLiu/comments/178673.html</wfw:comment><comments>http://www.blogjava.net/EvanLiu/archive/2008/01/31/178673.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/EvanLiu/comments/commentRss/178673.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/EvanLiu/services/trackbacks/178673.html</trackback:ping><description><![CDATA[<strong><u><span style="color: #505bff"><strong><u>ADAPTER</u></strong> —在朋友聚会上碰到了一个美女Sarah，从香港来的，可我不会说粤语，她不会说普通话，只好求助于我的朋友kent了，他作为我和Sarah之间的Adapter，让我和Sarah可以相互交谈了(也不知道他会不会耍我)</span></u></strong><br />
<br />
个人理解，适配器模式，就是两个水管A(Target)和C(Adaptee)接口不匹配不兼容，就拿另外一截管子B(Adapter)，一头接上原本的水管A（继承），另一头接上C(调用)。那么，A通过B，和C接上了。<br />
<br />
public interface Target {<br />
&nbsp;&nbsp;&nbsp; public void methodA();<br />
}<br />
public class Adaptee {<br />
&nbsp;&nbsp;&nbsp; public void methodB() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; //do something...<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
public class Adapter extends Target {<br />
&nbsp;&nbsp;&nbsp; private Adaptee ee;<br />
&nbsp;&nbsp;&nbsp; public Adapter(Adaptee ee) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; this.ee = ee;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void methodA() {&nbsp; //水管C Adapter的接口<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; ee.methodB();&nbsp; //实际调用了水管B Adaptee的接口<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
Adapter和Proxy的区别：<br />
<span style="color: #505bff">adapter是适配adaptee和target之间的关系<wbr>，proxy是realSubject对subject的代理。<br />
adaptee和target无关系，realSubject和s<wbr>ubject有继承关系。这就是他们的区别。</span><em><br />
<br />
这里有篇文章很不错，链接一下：<br />
</em><a href="http://yichao.blog.edu.cn/user2/yichaozhang/archives/2006/1501606.shtml">http://yichao.blog.edu.cn/user2/yichaozhang/archives/2006/1501606.shtml</a><br />
<br />
又找到网上另一个见解：<br />
<span><span style="color: #505bff">proxy 和adapter有一定类似，都是属于一种衔接性质的。<br />
区别是很明显的，从大体上说：proxy是一种原来对象的代表，其它需要与这个对象打交道的操作都是和这个代表交涉，就象歌星的经纪人一样。<br />
adapter目的则不是要虚构出一个代表者，而是为应付特定使用目的，将原来的类进行一些组合。</span><br />
<br />
<br />
</span><br />
<br />
<!-- 广告位 -->
<script type="text/JavaScript"> 
alimama_pid="mm_10891533_910884_1874773"; 
alimama_titlecolor="0000FF"; 
alimama_descolor ="000000"; 
alimama_bgcolor="FFFFFF"; 
alimama_bordercolor="E6E6E6"; 
alimama_linkcolor="008000"; 
alimama_bottomcolor="FFFFFF"; 
alimama_anglesize="0"; 
alimama_bgpic="0"; 
alimama_icon="0"; 
alimama_sizecode="15"; 
alimama_width=950; 
alimama_height=90; 
alimama_type=2; 
</script> 
<script src="http://a.alimama.cn/inf.js" type=text/javascript> 
</script>
<img src ="http://www.blogjava.net/EvanLiu/aggbug/178673.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/EvanLiu/" target="_blank">EvanLiu</a> 2008-01-31 14:28 <a href="http://www.blogjava.net/EvanLiu/archive/2008/01/31/178673.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Command模式</title><link>http://www.blogjava.net/EvanLiu/archive/2008/01/24/177539.html</link><dc:creator>EvanLiu</dc:creator><author>EvanLiu</author><pubDate>Thu, 24 Jan 2008 08:45:00 GMT</pubDate><guid>http://www.blogjava.net/EvanLiu/archive/2008/01/24/177539.html</guid><wfw:comment>http://www.blogjava.net/EvanLiu/comments/177539.html</wfw:comment><comments>http://www.blogjava.net/EvanLiu/archive/2008/01/24/177539.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/EvanLiu/comments/commentRss/177539.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/EvanLiu/services/trackbacks/177539.html</trackback:ping><description><![CDATA[<p><span style="color: #4328ff">
<p>14、COMMAND—俺有一个MM家里管得特别严，没法见面，只好借助于她弟弟在我们俩之间传送信息，她对我有什么指示，就写一张纸条让她弟弟带给我。<br />
这不，她弟弟又传送过来一个COMMAND，为了感谢他，我请他吃了碗杂酱面，哪知道他说："我同时给我姐姐三个男朋友送COMMAND，就数你最小气，才请我吃面。"，:-(</p>
<p>命令模式：命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开，委派给不同的对象。<br />
命令模式允许请求的一方和发送的一方独立开来，使得请求的一方不必知道接收请求的一方的接口，更不必知道请求是怎么被接收，以及操作是否执行，<br />
何时被执行以及是怎么被执行的。系统支持命令的撤消。</p>
</span>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img height="231" alt="" src="http://www.blogjava.net/images/blogjava_net/evanliu/command.JPG" width="367" /><br />
<br />
<span style="color: #4328ff">典型的Command模式需要有一个接口.接口中有一个统一的方法,这就是"将命令/请求封装为对象":<br />
public interface Command {<br />
&nbsp;&nbsp;&nbsp; public abstract void execute ( );<br />
}</span><br />
<br />
《Java与模式》一书中的例子如下：<br />
<span style="color: #4328ff">/**<br />
&nbsp;* 客户端(Client)代码<br />
&nbsp;*/<br />
public class Client {<br />
&nbsp;&nbsp; &nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Receiver receiver = new Receiver();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Command command = new ConcreteCommand(receiver);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Invoker invoker = new Invoker(command);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;invoker.action();<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
/**<br />
&nbsp;* 请求者(Invoker)角色代码<br />
&nbsp;*/<br />
public class Invoker {<br />
&nbsp;&nbsp; &nbsp;private Command command;<br />
&nbsp;&nbsp; &nbsp;public Invoker(Command command) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;this.command = command;<br />
&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;public void action() {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;command.execute();<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
/**<br />
&nbsp;* 接收者(Receiver)角色代码<br />
&nbsp;*/<br />
public class Receiver {<br />
&nbsp;&nbsp; &nbsp;public Receiver() {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//write code here<br />
&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;public void action() {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println(""Action has been taken);<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
/**<br />
&nbsp;* 抽象命令角色由Command接口扮演<br />
&nbsp;*/<br />
public class Command {<br />
&nbsp;&nbsp; &nbsp;void execute();<br />
}<br />
/**<br />
&nbsp;* 具体命令类<br />
&nbsp;*/<br />
public class ConcreteCommand implements Command {<br />
&nbsp;&nbsp; &nbsp;private Receiver receiver;<br />
&nbsp;&nbsp; &nbsp;public ConcreteCommand(Receiver receiver) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;this.receiver = receiver;<br />
&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;public void execute() {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;receiver.action();<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
<br />
<br />
<span style="color: #020000">再用某公司写的Command模式，简化代码写个大概样子：</span><br />
/**<br />
&nbsp;* 客户端(Client)代码<br />
&nbsp;*/<br />
public class Client {<br />
&nbsp;&nbsp; &nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String receiverName = "xAO";<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String methodName = "methodA";<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//receiverName这里用Spring的依赖注入来创建Receiver对象<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Command command = new ConcreteCommand(receiverName);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;command.getParameters.put("method", methodName);&nbsp;&nbsp; //实际代码做了封装，并不是这样直接写的。这里简化一下<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;command.getParameters.put("param1", "param1"); //传递参数<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;command.getParameters.put("param2", "param2");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Result result = getNewInvoker.execute(command); //创建Invoker对象，并调用receiver执行最终的方法<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
/**<br />
&nbsp;* 请求者(Invoker)角色代码<br />
&nbsp;*/<br />
public class Invoker {<br />
&nbsp;&nbsp; &nbsp;private Command command;<br />
&nbsp;&nbsp; &nbsp;public Invoker(Command command) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;this.command = command;<br />
&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;public void action() {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;command.execute();<br />
&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;private BeanFactoryService&nbsp; beanFactory;<br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;public Result execute(Command command) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ApplicationObject ao = beanFactory.getBean(command.getName(), ApplicationObject.class, new XXProcessor(command));<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return ao.execute();&nbsp; //这里就是接收者Receiver来执行具体方法: </span><span style="color: #4328ff">xAO.methodA();</span><br />
<span style="color: #4328ff">&nbsp;&nbsp; &nbsp;}<br />
}<br />
<br />
/**<br />
&nbsp;* 抽象命令角色由Command接口扮演<br />
&nbsp;*/<br />
public class Command {<br />
&nbsp;&nbsp; &nbsp;//...<br />
&nbsp;&nbsp; &nbsp;//没有execute()方法<br />
}<br />
/**<br />
&nbsp;* 具体命令类<br />
&nbsp;*/<br />
public class ConcreteCommand implements Command {<br />
&nbsp;&nbsp; &nbsp;//也没有execute()方法<br />
&nbsp;&nbsp; &nbsp;//...<br />
}<br />
<br />
<br />
<br />
</span><br />
<!-- 广告位 -->
<script type="text/JavaScript"> 
alimama_pid="mm_10891533_910884_1874773"; 
alimama_titlecolor="0000FF"; 
alimama_descolor ="000000"; 
alimama_bgcolor="FFFFFF"; 
alimama_bordercolor="E6E6E6"; 
alimama_linkcolor="008000"; 
alimama_bottomcolor="FFFFFF"; 
alimama_anglesize="0"; 
alimama_bgpic="0"; 
alimama_icon="0"; 
alimama_sizecode="15"; 
alimama_width=950; 
alimama_height=90; 
alimama_type=2; 
</script> 
<script src="http://a.alimama.cn/inf.js" type=text/javascript> 
</script>
<img src ="http://www.blogjava.net/EvanLiu/aggbug/177539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/EvanLiu/" target="_blank">EvanLiu</a> 2008-01-24 16:45 <a href="http://www.blogjava.net/EvanLiu/archive/2008/01/24/177539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Proxy模式</title><link>http://www.blogjava.net/EvanLiu/archive/2008/01/24/177479.html</link><dc:creator>EvanLiu</dc:creator><author>EvanLiu</author><pubDate>Thu, 24 Jan 2008 05:48:00 GMT</pubDate><guid>http://www.blogjava.net/EvanLiu/archive/2008/01/24/177479.html</guid><wfw:comment>http://www.blogjava.net/EvanLiu/comments/177479.html</wfw:comment><comments>http://www.blogjava.net/EvanLiu/archive/2008/01/24/177479.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/EvanLiu/comments/commentRss/177479.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/EvanLiu/services/trackbacks/177479.html</trackback:ping><description><![CDATA[<span id="_ctl0_content_ShowArticle___lbl_content" style="font-size: 10pt; color: black"><font size="2"><font face="楷体_GB2312"><span><span style="color: #404cff">12、PROXY?跟MM在网上聊天，一开头总是&#8220;hi,你好&#8221;,&#8220;你从哪儿来呀？&#8221;&#8220;你多大了？&#8221;&#8220;身高多少呀？&#8221;这些话，真烦人，写个程序做为我的Proxy吧，凡是接收到这些话都设置好了自动的回答，接收到其他的话时再通知我回答，怎么样，酷吧。</span><br />
<br />
<span style="color: #404cff">代理模式：代理模式给某一个对象提供一个代理对象，并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下，客户不想或者不能够直接引用一个对象，代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象，而仅仅持有一个被代理对象的接口，这时候代理对象不能够创建被代理对象，被代理对象必须有系统的其他角色代为创建并传入。</span><br />
<br />
</span></font></font></span>public interface Subject {<br />
&nbsp;&nbsp;&nbsp; public void methodA();<br />
}<br />
<span id="_ctl0_content_ShowArticle___lbl_content" style="font-size: 10pt; color: black"><font size="2"><font face="楷体_GB2312"><span>public class RealSubject implements Subject {<br />
&nbsp;&nbsp;&nbsp; public void methodA() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; System.out.println("...");<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
public class Proxy implements Subject {<br />
&nbsp;&nbsp;&nbsp; private RealSubject r;<br />
&nbsp;&nbsp;&nbsp; public void methodA() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; if(r == null) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; r = RealSubject();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; r.methodA();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; //do something...<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
我觉得可以理解为通过RealSubject的兄弟Proxy去调用RealSubject的方法<br />
<br />
和Decorator模式的比较：<br />
<span style="color: #404cff"><span id="_ctl0_content_ShowArticle___lbl_content" style="font-size: 10pt; color: black"><font size="2"><font face="楷体_GB2312"><span>相同点：</span></font></font></span>Both patterns use a proxy that forwards method calls to another object, known as the real subject.<br />
不同点：<span>with the Proxy pattern, the relationship between a proxy and the real subject is typically set at compile time, whereas&nbsp; decorators can be recursively constructed at runtime.<br />
从另一种角度考虑：</span>proxy是对类的代理，强调的是对已有功能的代理；而decorator更多的是用于增加装饰，来丰富类的内涵。</span></span></font></font></span><br />
<br />
Adapter和Proxy的区别：<br />
<span style="color: #404cff">adapter是适配adaptee和target之间的关系<wbr>，proxy是realSubject对subject的代理。<br />
adaptee和target无关系，realSubject和s<wbr>ubject有继承关系。这就是他们的区别。</span><em><span style="color: #404cff"><em><br />
</em></span></em><em><br />
这里有篇文章很不错，链接一下：<br />
</em>http://yichao.blog.edu.cn/user2/yichaozhang/archives/2006/1501606.shtml<br />
<br />
又找到网上另一个见解：<br />
<span><span style="color: #505bff">proxy 和adapter有一定类似，都是属于一种衔接性质的。<br />
区别是很明显的，从大体上说：proxy是一种原来对象的代表，其它需要与这个对象打交道的操作都是和这个代表交涉，就象歌星的经纪人一样。<br />
adapter目的则不是要虚构出一个代表者，而是为应付特定使用目的，将原来的类进行一些组合。</span><br />
</span><br />
<!-- 广告位 -->
<script type="text/JavaScript"> 
alimama_pid="mm_10891533_910884_1874773"; 
alimama_titlecolor="0000FF"; 
alimama_descolor ="000000"; 
alimama_bgcolor="FFFFFF"; 
alimama_bordercolor="E6E6E6"; 
alimama_linkcolor="008000"; 
alimama_bottomcolor="FFFFFF"; 
alimama_anglesize="0"; 
alimama_bgpic="0"; 
alimama_icon="0"; 
alimama_sizecode="15"; 
alimama_width=950; 
alimama_height=90; 
alimama_type=2; 
</script> 
<script src="http://a.alimama.cn/inf.js" type=text/javascript> 
</script> 
<img src ="http://www.blogjava.net/EvanLiu/aggbug/177479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/EvanLiu/" target="_blank">EvanLiu</a> 2008-01-24 13:48 <a href="http://www.blogjava.net/EvanLiu/archive/2008/01/24/177479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Decorator/Wrapper模式</title><link>http://www.blogjava.net/EvanLiu/archive/2008/01/24/177450.html</link><dc:creator>EvanLiu</dc:creator><author>EvanLiu</author><pubDate>Thu, 24 Jan 2008 03:31:00 GMT</pubDate><guid>http://www.blogjava.net/EvanLiu/archive/2008/01/24/177450.html</guid><wfw:comment>http://www.blogjava.net/EvanLiu/comments/177450.html</wfw:comment><comments>http://www.blogjava.net/EvanLiu/archive/2008/01/24/177450.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/EvanLiu/comments/commentRss/177450.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/EvanLiu/services/trackbacks/177450.html</trackback:ping><description><![CDATA[<span id="_ctl0_content_ShowArticle___lbl_content" style="font-size: 10pt; color: black;"><font size="2"><font face="楷体_GB2312"><span><span style="color: #2835ff;">9、 DECORATOR: Mary过完轮到Sarly过生日，还是不要叫她自己挑了，不然这个月伙食费肯定玩完，拿出我去年在华山顶上照的照片，在背面写上 &#8220;最好的的礼物，就是爱你的Fita&#8221;，再到街上礼品店买了个像框（卖礼品的MM也很漂亮哦），再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来&#8230;&#8230;，我们都是Decorator，最终都在修饰我这个人呀，怎么样，看懂了吗？</span><br />
<br />
<span style="color: #2835ff;">装饰模式：装饰模式以对客户端透明的方式扩展对象的功能，是继承关系的一个替代方案，提供比继承更多的灵活性。动态给一个对象增加功能，这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。</span><br />
<br />
</span></font></font></span><span style="font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/evanliu/Decorator.JPG" width="524" height="337" /><br />
<span style="color: #2835ff;">它最经典的特征就是：</span></span><font face="Times New Roman"><br />
1.</font><span style="font-family: 宋体;">必须有一个<span style="color: red;">它自己的父类</span>为<span style="color: red;">自己的成员变量；<br />
</span></span><font face="Times New Roman">2.</font><span style="font-family: 宋体;">必须继承公共父类。<br />
<br />
<br />
public interface Component {<br />
&nbsp;&nbsp;&nbsp; public void methodA();<br />
}<br />
public class ConcreteComponent implements Component {<br />
&nbsp;&nbsp;&nbsp; public void methodA() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; //do somthing...<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
public class Decorator implements Component {<br />
&nbsp;&nbsp;&nbsp; private Component c;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public Decorator(Component c) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; this.c = c;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void methodA() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; //do sth.<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; c.methodA();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; //do sth.<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
下面这个例子来自Head First，收藏<br />
<a href="http://www.blogjava.net/sterning/archive/2008/01/21/176679.html">http://www.blogjava.net/sterning/archive/2008/01/21/176679.html</a></span>
<!-- 广告位 -->
<script type="text/JavaScript">
alimama_pid="mm_10891533_910884_1874773";
alimama_titlecolor="0000FF";
alimama_descolor ="000000";
alimama_bgcolor="FFFFFF";
alimama_bordercolor="E6E6E6";
alimama_linkcolor="008000";
alimama_bottomcolor="FFFFFF";
alimama_anglesize="0";
alimama_bgpic="0";
alimama_icon="0";
alimama_sizecode="15";
alimama_width=950;
alimama_height=90;
alimama_type=2;
</script>
<script src="http://a.alimama.cn/inf.js" type=text/javascript>
</script>
<img src ="http://www.blogjava.net/EvanLiu/aggbug/177450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/EvanLiu/" target="_blank">EvanLiu</a> 2008-01-24 11:31 <a href="http://www.blogjava.net/EvanLiu/archive/2008/01/24/177450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>观察者模式（Observer）</title><link>http://www.blogjava.net/EvanLiu/archive/2007/11/12/160018.html</link><dc:creator>EvanLiu</dc:creator><author>EvanLiu</author><pubDate>Mon, 12 Nov 2007 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/EvanLiu/archive/2007/11/12/160018.html</guid><wfw:comment>http://www.blogjava.net/EvanLiu/comments/160018.html</wfw:comment><comments>http://www.blogjava.net/EvanLiu/archive/2007/11/12/160018.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/EvanLiu/comments/commentRss/160018.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/EvanLiu/services/trackbacks/160018.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt; font-family: 宋体;"><strong><span style="color: blue;">19</span></strong></span><strong><span style="font-size: 10pt; color: blue; font-family: 宋体;">、OBSERVER</span></strong><span style="font-size: 10pt; font-family: 宋体;">&nbsp;—</span><span style="font-size: 10pt; font-family: 宋体;">想知道咱们公司最新MM情报吗？加入公司的MM情报邮件组就行了，tom负责搜集情报，他发现的新情报不用一个一个通知我们，直接发布给邮件组，我们作为订阅者（观察者）就可以及时收到情报啦 </span><span style="font-size: 10pt; font-family: 宋体;"><br />
<br />
</span><strong><span style="font-size: 10pt; font-family: 宋体;">观察者模式</span></strong><span style="font-size: 10pt; font-family: 宋体;">：观察者模式定义了一种一队多的依赖关系，让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时，会通知所有观察者对象，使他们能够自动更新自己。<br />
<br />
</span><br />
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="3"><span style="font-family: 宋体;">观察者（</span><font face="Times New Roman">Observer</font><span style="font-family: 宋体;">）模式又名发布</span><font face="Times New Roman">-</font><span style="font-family: 宋体;">订阅（</span><font face="Times New Roman">Publish/Subscribe</font><span style="font-family: 宋体;">）模式。</span><font face="Times New Roman">GOF</font><span style="font-family: 宋体;">给观察者模式如下定义：定义对象间的一种一对多的依赖关系，当一个对象的状态发生改变时，所有依赖于它的对象都得到通知并被自动更新。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="3"><span style="font-family: 宋体;">观察者模式的组成部分。</span></font></p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;"><font face="Times New Roman"><font size="3">1)</font><span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font><font size="3"><span style="font-family: 宋体;">抽象目标角色（</span><font face="Times New Roman">Subject</font><span style="font-family: 宋体;">）</span></font></p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;"><font face="Times New Roman"><font size="3">2)</font><span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font><font size="3"><span style="font-family: 宋体;">抽象观察者角色（</span><font face="Times New Roman">Observer</font><span style="font-family: 宋体;">）</span></font></p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;"><font face="Times New Roman"><font size="3">3)</font><span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font><font size="3"><span style="font-family: 宋体;">具体目标角色（</span><font face="Times New Roman">Concrete Subject</font><span style="font-family: 宋体;">）</span></font></p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;"><font face="Times New Roman"><font size="3">4)</font><span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font><font size="3"><span style="font-family: 宋体;">具体观察者角色（</span><font face="Times New Roman">Concrete Observer</font><span style="font-family: 宋体;">）</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><br />
<font size="3"></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><br />
<font size="3"></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="3"><span style="font-family: 宋体;"><br />
</span></font></p>
<br />
<span style="font-size: 10pt; font-family: 宋体;"><br />
</span><br />
<!-- 广告位 -->
<script type="text/JavaScript"> 
alimama_pid="mm_10891533_910884_1874773"; 
alimama_titlecolor="0000FF"; 
alimama_descolor ="000000"; 
alimama_bgcolor="FFFFFF"; 
alimama_bordercolor="E6E6E6"; 
alimama_linkcolor="008000"; 
alimama_bottomcolor="FFFFFF"; 
alimama_anglesize="0"; 
alimama_bgpic="0"; 
alimama_icon="0"; 
alimama_sizecode="15"; 
alimama_width=950; 
alimama_height=90; 
alimama_type=2; 
</script> 
<script src="http://a.alimama.cn/inf.js" type=text/javascript> 
</script>
<img src ="http://www.blogjava.net/EvanLiu/aggbug/160018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/EvanLiu/" target="_blank">EvanLiu</a> 2007-11-12 17:44 <a href="http://www.blogjava.net/EvanLiu/archive/2007/11/12/160018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>