﻿<?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-BaoYaEr-文章分类-设计模式</title><link>http://www.blogjava.net/baoyaer/category/18354.html</link><description>java</description><language>zh-cn</language><lastBuildDate>Fri, 19 Mar 2010 21:58:51 GMT</lastBuildDate><pubDate>Fri, 19 Mar 2010 21:58:51 GMT</pubDate><ttl>60</ttl><item><title>jdonjive分析（4）缓存机制</title><link>http://www.blogjava.net/baoyaer/articles/172389.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 03 Jan 2008 02:35:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/172389.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/172389.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/172389.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/172389.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/172389.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;Jive的缓存机制Jive论坛的一个主要特点就是其性能速度快，因此很多巨大访问量的网站都采用了Jive论坛。这些都是由于Jive采取了高速缓存机制。缓存（Cache）机制是提高系统运行性能必不可少的技术。缓存机制从原理上讲比较简单，就是在原始数据第一次读取后保存在内存中，下次读取时，就直接从内存中读取。原始数据有可能保存在持久化介质或网络上。缓存机制也是代理模式的一种实...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/172389.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/172389.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-01-03 10:35 <a href="http://www.blogjava.net/baoyaer/articles/172389.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JdonJive论坛设计模式分析(3) ---安全管理机制</title><link>http://www.blogjava.net/baoyaer/articles/172372.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 03 Jan 2008 01:53:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/172372.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/172372.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/172372.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/172372.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/172372.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Jive安全管理机制在Jive中除了前面介绍的有关设计模式实现组件外，还有其他有一定特点的组件功能，分析研究这些组件功能可以更加完整透彻地理解Jive论坛系统。Jive安全管理机制基本是由下列部分组成：&#183;&nbsp;&nbsp;&nbsp; 安全验证机制。主要是验证用户名和密码组合是否与数据库中注册时的数据一致，以确认该用户身份为注册用户。这是对所有的JSP访问都进行拦截...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/172372.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/172372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-01-03 09:53 <a href="http://www.blogjava.net/baoyaer/articles/172372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JdonJive论坛设计模式分析(2) </title><link>http://www.blogjava.net/baoyaer/articles/171423.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Sat, 29 Dec 2007 02:17:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/171423.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/171423.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/171423.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/171423.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/171423.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 过滤器与装饰模式装饰（Decorator）模式是动态给一个对象添加一些额外的职责，或者说改变这个对象的一些行为。这就类似于使用油漆为某个东西刷上油漆，在原来的对象表面增加了一层外衣。在装饰模式中，有两个主要角色：一个是被刷油漆的对象（decoratee）；另外一个是给decoratee刷油漆的对象（decorator）。这两个对象都继承同一个接口。首先举一个简单例子来说明什么是装饰模式...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/171423.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/171423.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-29 10:17 <a href="http://www.blogjava.net/baoyaer/articles/171423.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JdonJive论坛设计模式分析(1) </title><link>http://www.blogjava.net/baoyaer/articles/171408.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Sat, 29 Dec 2007 01:34:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/171408.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/171408.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/171408.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/171408.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/171408.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1 Jive功能需求Jive功能需求分析类似于一个新系统的需求分析。只有了解Jive系统实现了哪些论坛功能，才能进一步研究和学习它是怎样巧妙、优雅地实现这些功能的。在Jive论坛系统中，用户角色和权限是紧密联系在一起的。主要分两大角色：普通用户和管理员，具体的表现形式是通过权限组合来体现的。管理方面的权限有：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/171408.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/171408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-29 09:34 <a href="http://www.blogjava.net/baoyaer/articles/171408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式趣解（百度上的一篇文章） </title><link>http://www.blogjava.net/baoyaer/articles/166994.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 11 Dec 2007 09:25:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/166994.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/166994.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/166994.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/166994.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/166994.html</trackback:ping><description><![CDATA[<div class="f14 p90 pl10">Factory <br />
Singleton(单态) <br />
Builder <br />
Prototype(原型) <br />
Flyweight <br />
Bridge <br />
Decorator(油漆工) <br />
Composite(组合) <br />
Adapter(适配器) <br />
Proxy(代理) <br />
Facade(外观 总管 Manager) <br />
Visitor <br />
Observer</div>
<a name="71998825">
<div class="f14 p90 pl10">1、FACTORY?追MM少不了请吃饭了，麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西，虽然口味有所不同，但不管你带MM去麦当劳或肯德基，只管向服务员说&#8220;来四个鸡翅&#8221;就行了。麦当劳和肯德基就是生产鸡翅的Factory 工厂模式：客户类和工厂类分开。消费者任何时候需要某种产品，只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时，工厂类也要做相应的修改。如：如何创建及如何向客户端提供。 <br />
<br />
2、BUILDER?MM最爱听的就是&#8220;我爱你&#8221;这句话了，见到不同地方的MM,要能够用她们的方言跟她说这句话哦，我有一个多种语言翻译机，上面每种语言都有一个按键，见到MM我只要按对应的键，它就能够用相应的语言说出&#8220;我爱你&#8221;这句话了，国外的MM也可以轻松搞掂，这就是我的&#8220;我爱你&#8221;builder。（这一定比美军在伊拉克用的翻译机好卖） 建造模式：将产品的内部表象和产品的生成过程分割开来，从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化，客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。 <br />
<br />
3、FACTORY METHOD?请MM去麦当劳吃汉堡，不同的MM有不同的口味，要每个都记住是一件烦人的事情，我一般采用Factory Method模式，带着MM到服务员那儿，说&#8220;要一个汉堡&#8221;，具体要什么样的汉堡呢，让MM直接跟服务员说就行了。 工厂方法模式：核心工厂类不再负责所有产品的创建，而是将具体创建的工作交给子类去做，成为一个抽象工厂角色，仅负责给出具体工厂类必须实现的接口，而不接触哪一个产品类应当被实例化这种细节。 <br />
<br />
4、PROTOTYPE?跟MM用QQ聊天，一定要说些深情的话语了，我搜集了好多肉麻的情话，需要时只要copy出来放到QQ里面就行了，这就是我的情话prototype了。（100块钱一份，你要不要） 原始模型模式：通过给出一个原型对象来指明所要创建的对象的类型，然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类，产品类不需要非得有任何事先确定的等级结构，原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。 <br />
<br />
5、SINGLETON?俺有6个漂亮的老婆，她们的老公都是我，我就是我们家里的老公Sigleton，她们只要说道&#8220;老公&#8221;，都是指的同一个人，那就是我(刚才做了个梦啦，哪有这么好的事) 单例模式：单例模式确保某一个类只有一个实例，而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的&#8220;单一实例&#8221;的需求时才可使用。 [b:9ceca65206]结构型模式[/b:9ceca65206] <br />
<br />
6、ADAPTER?在朋友聚会上碰到了一个美女Sarah，从香港来的，可我不会说粤语，她不会说普通话，只好求助于我的朋友kent了，他作为我和Sarah之间的Adapter，让我和Sarah可以相互交谈了(也不知道他会不会耍我) 适配器（变压器）模式：把一个类的接口变换成客户端所期待的另一种接口，从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。 <br />
<br />
7、BRIDGE?早上碰到MM，要说早上好，晚上碰到MM，要说晚上好；碰到MM穿了件新衣服，要说你的衣服好漂亮哦，碰到MM新做的发型，要说你的头发好漂亮哦。不要问我&#8220;早上碰到MM新做了个发型怎么说&#8221;这种问题，自己用BRIDGE组合一下不就行了 桥梁模式：将抽象化与实现化脱耦，使得二者可以独立的变化，也就是说将他们之间的强关联变成弱关联，也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系，从而使两者可以独立的变化。 <br />
<br />
8、COMPOSITE?Mary今天过生日。&#8220;我过生日，你要送我一件礼物。&#8221;&#8220;嗯，好吧，去商店，你自己挑。&#8221;&#8220;这件T恤挺漂亮，买，这条裙子好看，买，这个包也不错，买。&#8221;&#8220;喂，买了三件了呀，我只答应送一件礼物的哦。&#8221;&#8220;什么呀，T恤加裙子加包包，正好配成一套呀，小姐，麻烦你包起来。&#8221;&#8220;&#8230;&#8230;&#8221;，MM都会用Composite模式了，你会了没有？ 合成模式：合成模式将对象组织到树结构中，可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。 <br />
<br />
9、DECORATOR?Mary过完轮到Sarly过生日，还是不要叫她自己挑了，不然这个月伙食费肯定玩完，拿出我去年在华山顶上照的照片，在背面写上&#8220;最好的的礼物，就是爱你的Fita&#8221;，再到街上礼品店买了个像框（卖礼品的MM也很漂亮哦），再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来&#8230;&#8230;，我们都是Decorator，最终都在修饰我这个人呀，怎么样，看懂了吗？ 装饰模式：装饰模式以对客户端透明的方式扩展对象的功能，是继承关系的一个替代方案，提供比继承更多的灵活性。动态给一个对象增加功能，这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。 <br />
<br />
10、FACADE?我有一个专业的Nikon相机，我就喜欢自己手动调光圈、快门，这样照出来的照片才专业，但MM可不懂这些，教了半天也不会。幸好相机有Facade设计模式，把相机调整到自动档，只要对准目标按快门就行了，一切由相机自动调整，这样MM也可以用这个相机给我拍张照片了。 门面模式：外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口，使得子系统更易于使用。每一个子系统只有一个门面类，而且此门面类只有一个实例，也就是说它是一个单例模式。但整个系统可以有多个门面类。 <br />
<br />
11、FLYWEIGHT?每天跟MM发短信，手指都累死了，最近买了个新手机，可以把一些常用的句子存在手机里，要用的时候，直接拿出来，在前面加上MM的名字就可以发送了，再不用一个字一个字敲了。共享的句子就是Flyweight，MM的名字就是提取出来的外部特征，根据上下文情况使用。 享元模式：FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部，不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态，它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来，将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象，而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。 <br />
<br />
12、PROXY?跟MM在网上聊天，一开头总是&#8220;hi,你好&#8221;,&#8220;你从哪儿来呀？&#8221;&#8220;你多大了？&#8221;&#8220;身高多少呀？&#8221;这些话，真烦人，写个程序做为我的Proxy吧，凡是接收到这些话都设置好了自己的回答，接收到其他的话时再通知我回答，怎么样，酷吧。 代理模式：代理模式给某一个对象提供一个代理对象，并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下，客户不想或者不能够直接引用一个对象，代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象，而仅仅持有一个被代理对象的接口，这时候代理对象不能够创建被代理对象，被代理对象必须有系统的其他角色代为创建并传入。 [b:9ceca65206]行为模式[/b:9ceca65206] <br />
<br />
13、CHAIN OF RESPONSIBLEITY?晚上去上英语课，为了好开溜坐到了最后一排，哇，前面坐了好几个漂亮的MM哎，找张纸条，写上&#8220;Hi,可以做我的女朋友吗？如果不愿意请向前传&#8221;，纸条就一个接一个的传上去了，糟糕，传到第一排的MM把纸条传给老师了，听说是个老处女呀，快跑! 责任链模式：在责任链模式中，很多对象由每一个对象对其下家的引用而接 起来形成一条链。请求在这个链上传递，直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求，系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择：承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。 <br />
<br />
14、COMMAND?俺有一个MM家里管得特别严，没法见面，只好借助于她弟弟在我们俩之间传送信息，她对我有什么指示，就写一张纸条让她弟弟带给我。这不，她弟弟又传送过来一个COMMAND，为了感谢他，我请他吃了碗杂酱面，哪知道他说：&#8220;我同时给我姐姐三个男朋友送COMMAND，就数你最小气，才请我吃面。&#8221;， 命令模式：命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开，委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来，使得请求的一方不必知道接收请求的一方的接口，更不必知道请求是怎么被接收，以及操作是否执行，何时被执行以及是怎么被执行的。系统支持命令的撤消。 <br />
<br />
15、INTERPRETER?俺有一个《泡MM真经》，上面有各种泡MM的攻略，比如说去吃西餐的步骤、去看电影的方法等等，跟MM约会时，只要做一个Interpreter，照着上面的脚本执行就可以了。 解释器模式：给定一个语言后，解释器模式可以定义出其文法的一种表示，并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后，使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构，也就是一系列的组合规则。每一个命令对象都有一个解释方法，代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。 <br />
<br />
16、ITERATOR?我爱上了Mary，不顾一切的向她求婚。 Mary：&#8220;想要我跟你结婚，得答应我的条件&#8221; 我：&#8220;什么条件我都答应，你说吧&#8221; Mary：&#8220;我看上了那个一克拉的钻石&#8221; 我：&#8220;我买，我买，还有吗？&#8221; Mary：&#8220;我看上了湖边的那栋别墅&#8221; 我：&#8220;我买，我买，还有吗？&#8221; Mary：&#8220;我看上那辆法拉利跑车&#8221; 我脑袋嗡的一声，坐在椅子上，一咬牙：&#8220;我买，我买，还有吗？&#8221; &#8230;&#8230; 迭代子模式：迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集，聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中，从而与聚集本身隔开。迭代子模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象，每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。 <br />
<br />
17、MEDIATOR?四个MM打麻将，相互之间谁应该给谁多少钱算不清楚了，幸亏当时我在旁边，按照各自的筹码数算钱，赚了钱的从我这里拿，赔了钱的也付给我，一切就OK啦，俺得到了四个MM的电话。 调停者模式：调停者模式包装了一系列对象相互作用的方式，使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时，不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对多的相互作用。调停者模式将对象的行为和协作抽象化，把对象在小尺度的行为上与其他对象的相互作用分开处理。 <br />
<br />
18、MEMENTO?同时跟几个MM聊天时，一定要记清楚刚才跟MM说了些什么话，不然MM发现了会不高兴的哦，幸亏我有个备忘录，刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存，这样可以随时察看以前的记录啦。 备忘录模式：备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下，将一个对象的状态捉住，并外部化，存储起来，从而可以在将来合适的时候把这个对象还原到存储起来的状态。 <br />
<br />
19、OBSERVER?想知道咱们公司最新MM情报吗？加入公司的MM情报邮件组就行了，tom负责搜集情报，他发现的新情报不用一个一个通知我们，直接发布给邮件组，我们作为订阅者（观察者）就可以及时收到情报啦 观察者模式：观察者模式定义了一种一队多的依赖关系，让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时，会通知所有观察者对象，使他们能够自动更新自己。 <br />
<br />
20、STATE?跟MM交往时，一定要注意她的状态哦，在不同的状态时她的行为会有不同，比如你约她今天晚上去看电影，对你没兴趣的MM就会说&#8220;有事情啦&#8221;，对你不讨厌但还没喜欢上的MM就会说&#8220;好啊，不过可以带上我同事么？&#8221;，已经喜欢上你的MM就会说&#8220;几点钟？看完电影再去泡吧怎么样？&#8221;，当然你看电影过程中表现良好的话，也可以把MM的状态从不讨厌不喜欢变成喜欢哦。 状态模式：状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里，每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候，其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时，系统便改变所选的子类。 <br />
<br />
21、STRATEGY?跟不同类型的MM约会，要用不同的策略，有的请电影比较好，有的则去吃小吃效果不错，有的去海边浪漫最合适，单目的都是为了得到MM的芳心，我的追MM锦囊中有好多Strategy哦。 策略模式：策略模式针对一组算法，将每一个算法封装到具有共同接口的独立的类中，从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模把行为和环境分开。环境类负责维持和查询行为类，各种算法在具体的策略类中提供。由于算法和环境独立开来，算法的增减，修改都不会影响到环境和客户端。 <br />
<br />
22、TEMPLATE METHOD??看过《如何说服女生上床》这部经典文章吗？女生从认识到上床的不变的步骤分为巧遇、打破僵局、展开追求、接吻、前戏、动手、爱抚、进去八大步骤(Template method)，但每个步骤针对不同的情况，都有不一样的做法，这就要看你随机应变啦(具体实现)； 模板方法模式：模板方法模式准备一个抽象类，将部分逻辑以具体方法以及具体构造子的形式实现，然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法，从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架，而将逻辑的细节留给具体的子类去实现。 <br />
<br />
23、VISITOR?情人节到了，要给每个MM送一束鲜花和一张卡片，可是每个MM送的花都要针对她个人的特点，每张卡片也要根据个人的特点来挑，我一个人哪搞得清楚，还是找花店老板和礼品店老板做一下Visitor，让花店老板根据MM的特点选一束花，让礼品店老板也根据每个人特点选一张卡，这样就轻松多了； 访问者模式：访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话，接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统，它把数据结构和作用于结构上的操作之间的耦合解脱开，使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易，就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中，而不是分散到一个个的节点类中。当使用访问者模式时，要将尽可能多的对象浏览逻辑放在访问者类中，而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。</a></div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/166994.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-11 17:25 <a href="http://www.blogjava.net/baoyaer/articles/166994.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>prototype设计模式</title><link>http://www.blogjava.net/baoyaer/articles/111827.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 19 Apr 2007 01:12:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/111827.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/111827.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/111827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/111827.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/111827.html</trackback:ping><description><![CDATA[<p>原型模式定义:<br>用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.</p>
<p>Prototype模式允许一个对象再创建另外一个可定制的对象，根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象，这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。</p>
<p>如何使用?<br>因为Java中的提供clone()方法来实现对象的克隆,所以Prototype模式实现一下子变得很简单.</p>
<p>以勺子为例：</p>
<table cellSpacing=3 cellPadding=3 width="96%" border=0>
    <tbody>
        <tr>
            <td bgColor=#cccccc>public abstract class AbstractSpoon implements Cloneable<br>{ <br>　　String spoonName; <br><br>　　public void setSpoonName(String spoonName) {this.spoonName = spoonName;}<br>　　public String getSpoonName() {return this.spoonName;}<br><br>　　public Object clone() <br>　　{<br>　　　　Object object = null;<br>　　　　try {<br>　　　　　　object = super.clone();<br>　　　　} catch (CloneNotSupportedException exception) {<br>　　　　　　System.err.println("AbstractSpoon is not Cloneable");<br>　　　　}<br>　　　　return object;<br>　　}<br>}<br></td>
        </tr>
    </tbody>
</table>
<p>有个具体实现(ConcretePrototype):</p>
<table cellSpacing=3 cellPadding=3 width="92%" border=0>
    <tbody>
        <tr>
            <td bgColor=#cccccc>
            <p>public class SoupSpoon extends AbstractSpoon<br>{ <br>　　public SoupSpoon()<br>　　{<br>　　　　setSpoonName("Soup Spoon"); <br>　　}<br>}<br></p>
            <p>&nbsp; </p>
            </td>
        </tr>
    </tbody>
</table>
<p>调用Prototype模式很简单:</p>
<p>AbstractSpoon spoon = new SoupSpoon();<br>AbstractSpoon spoon2 = spoon.clone(); </p>
<p>当然也可以结合工厂模式来创建AbstractSpoon实例。</p>
<p>在Java中Prototype模式变成clone()方法的使用，由于Java的纯洁的面向对象特性，使得在Java中使用设计模式变得很自然，两者已经几乎是浑然一体了。这反映在很多模式上，如Interator遍历模式。</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/111827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-04-19 09:12 <a href="http://www.blogjava.net/baoyaer/articles/111827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式之Decorator(油漆工)</title><link>http://www.blogjava.net/baoyaer/articles/90032.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 26 Dec 2006 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/90032.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/90032.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/90032.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/90032.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/90032.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: GoF														：								动态地给一个对象添加一些额外的职责。就增加功能来说，Decorator（装饰）模式相比生成子类更为灵活。								在系统开发的过程中，我们希望给某个对象而不是整个类添加一些功能。例如：我们要做一扇门，现在为了能将门做的美观和安全需要给门加上锁和把手，还可能给门加上窗户和雕花。这里我们把这些要添加的东西叫做门的...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/90032.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/90032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2006-12-26 09:45 <a href="http://www.blogjava.net/baoyaer/articles/90032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式之Adapter(适配器)</title><link>http://www.blogjava.net/baoyaer/articles/89452.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 22 Dec 2006 02:44:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/89452.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/89452.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/89452.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/89452.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/89452.html</trackback:ping><description><![CDATA[
		<p>
				<b>定义<span lang="EN-US">:</span></b>
				<span lang="EN-US">
						<br />将两个不兼容的类纠合在一起使用，属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份.</span>
		</p>
		<p>
				<b>为何使用<span lang="EN-US">?</span></b>
				<span lang="EN-US">
						<br />我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是：修改各自类的接口，但是如果我们没有源代码，或者，我们不愿意为了一个应用而修改各自的接口。 怎么办? </span>
		</p>
		<p>使用<span lang="EN-US">Adapter，在这两种接口之间创建一个混合接口(混血儿).</span></p>
		<p>
				<b>如何使用<span lang="EN-US">?</span></b>
				<span lang="EN-US">
						<br />实现Adapter方式,其实"think in Java"的"类再生"一节中已经提到,有两种方式：组合(composition)和继承(inheritance).</span>
		</p>
		<p>
				<span lang="EN-US">
						<br />假设我们要打桩，有两种类：方形桩 圆形桩.<br /></span>
		</p>
		<p>
		</p>
		<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">
				<img id="Codehighlighter1_22_114_Open_Image" onclick="this.style.display='none'; Codehighlighter1_22_114_Open_Text.style.display='none'; Codehighlighter1_22_114_Closed_Image.style.display='inline'; Codehighlighter1_22_114_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_22_114_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_22_114_Closed_Text.style.display='none'; Codehighlighter1_22_114_Open_Image.style.display='inline'; Codehighlighter1_22_114_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> SquarePeg</span>
				<span id="Codehighlighter1_22_114_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_22_114_Open_Text">
						<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_56_111_Open_Image" onclick="this.style.display='none'; Codehighlighter1_56_111_Open_Text.style.display='none'; Codehighlighter1_56_111_Closed_Image.style.display='inline'; Codehighlighter1_56_111_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_56_111_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_56_111_Closed_Text.style.display='none'; Codehighlighter1_56_111_Open_Image.style.display='inline'; Codehighlighter1_56_111_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> insert(String str)</span>
						<span id="Codehighlighter1_56_111_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_56_111_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　　　System.out.println(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">SquarePeg insert():</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000">str);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />　　}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img id="Codehighlighter1_138_242_Open_Image" onclick="this.style.display='none'; Codehighlighter1_138_242_Open_Text.style.display='none'; Codehighlighter1_138_242_Closed_Image.style.display='inline'; Codehighlighter1_138_242_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_138_242_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_138_242_Closed_Text.style.display='none'; Codehighlighter1_138_242_Open_Image.style.display='inline'; Codehighlighter1_138_242_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> RoundPeg</span>
				<span id="Codehighlighter1_138_242_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_138_242_Open_Text">
						<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_180_240_Open_Image" onclick="this.style.display='none'; Codehighlighter1_180_240_Open_Text.style.display='none'; Codehighlighter1_180_240_Closed_Image.style.display='inline'; Codehighlighter1_180_240_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_180_240_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_180_240_Closed_Text.style.display='none'; Codehighlighter1_180_240_Open_Image.style.display='inline'; Codehighlighter1_180_240_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> insertIntohole(String msg)</span>
						<span id="Codehighlighter1_180_240_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_180_240_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　　　System.out.println(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">RoundPeg insertIntoHole():</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000">msg);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>现在有一个应用<span lang="EN-US">,需要既打方形桩,又打圆形桩.那么我们需要将这两个没有关系的类综合应用.假设RoundPeg我们没有源代码,或源代码我们不想修改,那么我们使用Adapter来实现这个应用:</span></p>
		<p>
		</p>
		<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">
				<img id="Codehighlighter1_41_195_Open_Image" onclick="this.style.display='none'; Codehighlighter1_41_195_Open_Text.style.display='none'; Codehighlighter1_41_195_Closed_Image.style.display='inline'; Codehighlighter1_41_195_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_41_195_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_41_195_Closed_Text.style.display='none'; Codehighlighter1_41_195_Open_Image.style.display='inline'; Codehighlighter1_41_195_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> PegAdapter </span>
				<span style="COLOR: #0000ff">extends</span>
				<span style="COLOR: #000000"> SquarePeg</span>
				<span id="Codehighlighter1_41_195_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_41_195_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> RoundPeg roundPeg;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> PegAdapter(RoundPeg peg)(</span>
						<span style="COLOR: #0000ff">this</span>
						<span style="COLOR: #000000">.roundPeg</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">peg;)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_161_192_Open_Image" onclick="this.style.display='none'; Codehighlighter1_161_192_Open_Text.style.display='none'; Codehighlighter1_161_192_Closed_Image.style.display='inline'; Codehighlighter1_161_192_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_161_192_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_161_192_Closed_Text.style.display='none'; Codehighlighter1_161_192_Open_Image.style.display='inline'; Codehighlighter1_161_192_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> insert(String str)</span>
						<span id="Codehighlighter1_161_192_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_161_192_Open_Text">
								<span style="COLOR: #000000">{ roundPeg.insertIntoHole(str);}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>在上面代码中<span lang="EN-US">,RoundPeg属于Adaptee,是被适配者.PegAdapter是Adapter,将Adaptee(被适配者RoundPeg)和Target(目标SquarePeg)进行适配.实际上这是将组合方法(composition)和继承(inheritance)方法综合运用.</span></p>
		<p>
				<span lang="EN-US">PegAdapter首先继承SquarePeg，然后使用new的组合生成对象方式，生成RoundPeg的对象roundPeg，再重载父类insert()方法。从这里,你也了解使用new生成对象和使用extends继承生成对象的不同,前者无需对原来的类修改,甚至无需要知道其内部结构和源代码.</span>
		</p>
		<p>如果你有些<span lang="EN-US">Java使用的经验，已经发现，这种模式经常使用。</span></p>
		<p>
				<b>进一步使用</b>
				<span lang="EN-US">
						<br />上面的PegAdapter是继承了SquarePeg,如果我们需要两边继承，即继承SquarePeg 又继承RoundPeg,因为Java中不允许多继承，但是我们可以实现(implements)两个接口(interface)</span>
		</p>
		<p>
		</p>
		<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">
				<img id="Codehighlighter1_26_71_Open_Image" onclick="this.style.display='none'; Codehighlighter1_26_71_Open_Text.style.display='none'; Codehighlighter1_26_71_Closed_Image.style.display='inline'; Codehighlighter1_26_71_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_26_71_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_26_71_Closed_Text.style.display='none'; Codehighlighter1_26_71_Open_Image.style.display='inline'; Codehighlighter1_26_71_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">interface</span>
				<span style="COLOR: #000000"> IRoundPeg</span>
				<span id="Codehighlighter1_26_71_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_26_71_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> insertIntoHole(String msg);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_102_140_Open_Image" onclick="this.style.display='none'; Codehighlighter1_102_140_Open_Text.style.display='none'; Codehighlighter1_102_140_Closed_Image.style.display='inline'; Codehighlighter1_102_140_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_102_140_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_102_140_Closed_Text.style.display='none'; Codehighlighter1_102_140_Open_Image.style.display='inline'; Codehighlighter1_102_140_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">interface</span>
				<span style="COLOR: #000000"> ISquarePeg</span>
				<span id="Codehighlighter1_102_140_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_102_140_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> insert(String str); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<p>下面是新的<span lang="EN-US">RoundPeg 和SquarePeg, 除了实现接口这一区别，和上面的没什么区别。<br /></span></p>
		<p>
		</p>
		<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">
				<img id="Codehighlighter1_44_136_Open_Image" onclick="this.style.display='none'; Codehighlighter1_44_136_Open_Text.style.display='none'; Codehighlighter1_44_136_Closed_Image.style.display='inline'; Codehighlighter1_44_136_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_44_136_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_44_136_Closed_Text.style.display='none'; Codehighlighter1_44_136_Open_Image.style.display='inline'; Codehighlighter1_44_136_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> SquarePeg </span>
				<span style="COLOR: #0000ff">implements</span>
				<span style="COLOR: #000000"> ISquarePeg</span>
				<span id="Codehighlighter1_44_136_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_44_136_Open_Text">
						<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_78_133_Open_Image" onclick="this.style.display='none'; Codehighlighter1_78_133_Open_Text.style.display='none'; Codehighlighter1_78_133_Closed_Image.style.display='inline'; Codehighlighter1_78_133_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_78_133_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_78_133_Closed_Text.style.display='none'; Codehighlighter1_78_133_Open_Image.style.display='inline'; Codehighlighter1_78_133_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> insert(String str)</span>
						<span id="Codehighlighter1_78_133_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_78_133_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　　　System.out.println(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">SquarePeg insert():</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000">str);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />　　}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_182_288_Open_Image" onclick="this.style.display='none'; Codehighlighter1_182_288_Open_Text.style.display='none'; Codehighlighter1_182_288_Closed_Image.style.display='inline'; Codehighlighter1_182_288_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_182_288_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_182_288_Closed_Text.style.display='none'; Codehighlighter1_182_288_Open_Image.style.display='inline'; Codehighlighter1_182_288_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> RoundPeg </span>
				<span style="COLOR: #0000ff">implements</span>
				<span style="COLOR: #000000"> IRoundPeg</span>
				<span id="Codehighlighter1_182_288_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_182_288_Open_Text">
						<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_224_286_Open_Image" onclick="this.style.display='none'; Codehighlighter1_224_286_Open_Text.style.display='none'; Codehighlighter1_224_286_Closed_Image.style.display='inline'; Codehighlighter1_224_286_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_224_286_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_224_286_Closed_Text.style.display='none'; Codehighlighter1_224_286_Open_Image.style.display='inline'; Codehighlighter1_224_286_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> insertIntohole(String msg)</span>
						<span id="Codehighlighter1_224_286_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_224_286_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　　　System.out.println(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">RoundPeg insertIntoHole():</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000">msg);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />　　}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<p>下面是新的<span lang="EN-US">PegAdapter,叫做two-way adapter:</span></p>
		<p>
		</p>
		<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">
				<img id="Codehighlighter1_55_317_Open_Image" onclick="this.style.display='none'; Codehighlighter1_55_317_Open_Text.style.display='none'; Codehighlighter1_55_317_Closed_Image.style.display='inline'; Codehighlighter1_55_317_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_55_317_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_55_317_Closed_Text.style.display='none'; Codehighlighter1_55_317_Open_Image.style.display='inline'; Codehighlighter1_55_317_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> PegAdapter </span>
				<span style="COLOR: #0000ff">implements</span>
				<span style="COLOR: #000000"> IRoundPeg,ISquarePeg</span>
				<span id="Codehighlighter1_55_317_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_55_317_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> RoundPeg roundPeg;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> SquarePeg squarePeg;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000"> 构造方法</span>
						<span style="COLOR: #008000">
								<br />
								<img id="Codehighlighter1_162_181_Open_Image" onclick="this.style.display='none'; Codehighlighter1_162_181_Open_Text.style.display='none'; Codehighlighter1_162_181_Closed_Image.style.display='inline'; Codehighlighter1_162_181_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_162_181_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_162_181_Closed_Text.style.display='none'; Codehighlighter1_162_181_Open_Image.style.display='inline'; Codehighlighter1_162_181_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">　　</span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> PegAdapter(RoundPeg peg)</span>
						<span id="Codehighlighter1_162_181_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_162_181_Open_Text">
								<span style="COLOR: #000000">{</span>
								<span style="COLOR: #0000ff">this</span>
								<span style="COLOR: #000000">.roundPeg</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">peg;}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000"> 构造方法</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">　　</span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> PegAdapter(SquarePeg peg)(</span>
						<span style="COLOR: #0000ff">this</span>
						<span style="COLOR: #000000">.squarePeg</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">peg;) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_283_314_Open_Image" onclick="this.style.display='none'; Codehighlighter1_283_314_Open_Text.style.display='none'; Codehighlighter1_283_314_Closed_Image.style.display='inline'; Codehighlighter1_283_314_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_283_314_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_283_314_Closed_Text.style.display='none'; Codehighlighter1_283_314_Open_Image.style.display='inline'; Codehighlighter1_283_314_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> insert(String str)</span>
						<span id="Codehighlighter1_283_314_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_283_314_Open_Text">
								<span style="COLOR: #000000">{ roundPeg.insertIntoHole(str);}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<p>还有一种叫<span lang="EN-US">Pluggable Adapters,可以动态的获取几个adapters中一个。使用Reflection技术，可以动态的发现类中的Public方法。</span></p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/89452.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2006-12-22 10:44 <a href="http://www.blogjava.net/baoyaer/articles/89452.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java模式之Reactor</title><link>http://www.blogjava.net/baoyaer/articles/87514.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 13 Dec 2006 08:15:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/87514.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/87514.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/87514.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/87514.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/87514.html</trackback:ping><description><![CDATA[
		<p align="left">Java　NIO非堵塞应用通常适用用在I/O读写等方面，我们知道，系统运行的性能瓶颈通常在I/O读写，包括对端口和文件的操作上，过去，在打开一个I/O通道后，read()将一直等待在端口一边读取字节内容，如果没有内容进来，read()也是傻傻的等，这会影响我们程序继续做其他事情，那么改进做法就是开设线程，让线程去等待，但是这样做也是相当耗费资源的。</p>
		<p align="left">Java NIO非堵塞技术实际是采取Reactor模式，或者说是Observer模式为我们监察I/O端口，如果有内容进来，会自动通知我们，这样，我们就不必开启多个线程死等，从外界看，实现了流畅的I/O读写，不堵塞了。</p>
		<p align="left">Java NIO出现不只是一个技术性能的提高，你会发现网络上到处在介绍它，因为它具有里程碑意义，从JDK1.4开始，Java开始提高性能相关的功能，从而使得Java在底层或者并行分布式计算等操作上已经可以和C或Perl等语言并驾齐驱。</p>
		<p align="left">如果你至今还是在怀疑Java的性能，说明你的思想和观念已经完全落伍了，Java一两年就应该用新的名词来定义。从JDK1.5开始又要提供关于线程、并发等新性能的支持，Java应用在游戏等适时领域方面的机会已经成熟，Java在稳定自己中间件地位后，开始蚕食传统C的领域。</p>
		<p align="left">本文主要简单介绍NIO的基本原理，在下一篇文章中，将结合Reactor模式和著名线程大师<a href="http://gee.cs.oswego.edu/dl/">Doug Lea</a>的一篇文章深入讨论。</p>
		<p align="left">NIO主要原理和适用。</p>
		<p align="left">NIO 有一个主要的类Selector,这个类似一个观察者，只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情，当有事件发生时，他会通知我们，传回一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的socketchannel,然后，我们从这个Channel中读取数据，放心，包准能够读到，接着我们可以处理这些数据。</p>
		<p align="left">Selector内部原理实际是在做一个对所注册的channel的轮询访问，不断的轮询(目前就这一个算法)，一旦轮询到一个channel有所注册的事情发生，比如数据来了，他就会站起来报告，交出一把钥匙，让我们通过这把钥匙来读取这个channel的内容。</p>
		<p align="left">了解了这个基本原理，我们结合代码看看使用，在使用上，也在分两个方向，一个是线程处理，一个是用非线程，后者比较简单，看下面代码：</p>
		<table cellspacing="0" cellpadding="0" width="100%" bgcolor="#cccccc" border="0">
				<tbody>
						<tr>
								<td>
										<br />import java.io.*;<br />import java.nio.*;<br />import java.nio.channels.*;<br />import java.nio.channels.spi.*;<br />import java.net.*;<br />import java.util.*; 
<p>/**<br />*<br />* @author Administrator<br />* @version<br />*/<br />public class NBTest {</p><p><br />　　/** Creates new NBTest */<br />　　public NBTest()<br />　　{<br />　　}</p><p>　　public void startServer() throws Exception<br />　　{<br />　　int channels = 0;<br />　　int nKeys = 0;<br />　　int currentSelector = 0;<br /><br />　　//使用Selector<br />　　Selector selector = Selector.open();<br /><br />　　//建立Channel 并绑定到9000端口<br />　　ServerSocketChannel ssc = ServerSocketChannel.open();<br />　　InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(),9000); <br />　　ssc.socket().bind(address);<br /><br />　　//使设定non-blocking的方式。<br />　　ssc.configureBlocking(false);</p><p>　　//向Selector注册Channel及我们有兴趣的事件<br />　　SelectionKey s = ssc.register(selector, SelectionKey.OP_ACCEPT);<br />　　printKeyInfo(s);</p><p>　　while(true) //不断的轮询<br />　　{<br />　　　　debug("NBTest: Starting select");<br /><br />　　　　//Selector通过select方法通知我们我们感兴趣的事件发生了。<br />　　　　nKeys = selector.select();<br />　　　　//如果有我们注册的事情发生了，它的传回值就会大于0<br />　　　　if(nKeys &gt; 0)<br />　　　　{<br />　　　　　　debug("NBTest: Number of keys after select operation: " +nKeys);<br /><br />　　　　　　//Selector传回一组SelectionKeys<br />　　　　　　//我们从这些key中的channel()方法中取得我们刚刚注册的channel。<br />　　　　　　Set selectedKeys = selector.selectedKeys();<br />　　　　　　Iterator i = selectedKeys.iterator();<br />　　　　　　while(i.hasNext())<br />　　　　　　{<br />　　　　　　 　 s = (SelectionKey) i.next();<br />　　　　　　 　 printKeyInfo(s);<br />　　　　　　 　 debug("NBTest: Nr Keys in selector: " +selector.keys().size());<br /><br />　　　　　　 　 //一个key被处理完成后，就都被从就绪关键字（ready keys）列表中除去<br />　　　　　　 　 i.remove();<br />　　　　　　 　 if(s.isAcceptable())<br />　　　　　　 　 {<br />　　　　　　 　 　 // 从channel()中取得我们刚刚注册的channel。<br />　　　　　　 　 　 Socket socket = ((ServerSocketChannel)s.channel()).accept().socket();<br />　　　　　　 　 　 SocketChannel sc = socket.getChannel();<br /><br />　　　　　　 　 　 sc.configureBlocking(false);<br />　　　　　　 　 　 sc.register(selector, SelectionKey.OP_READ |SelectionKey.OP_WRITE);<br />　　　　　　 　 　 　　　　　　 　 　 System.out.println(++channels);<br />　　　　　　 　 }<br />　　　　　　 　 else<br />　　　　　　 　 {<br />　　　　　　 　 　 debug("NBTest: Channel not acceptable");<br />　　　　　　 　 }<br />　　　　　 }<br />　　　}<br />　　　else<br />　　　{<br />　　　　　　debug("NBTest: Select finished without any keys.");<br />　　　}</p><p>　 }<br /><br />}</p><p><br />private static void debug(String s)<br />{<br />　 System.out.println(s);<br />}</p><p><br />private static void printKeyInfo(SelectionKey sk)<br />{<br />　 String s = new String();</p><p>　 s = "Att: " + (sk.attachment() == null ? "no" : "yes");<br />　 s += ", Read: " + sk.isReadable();<br />　 s += ", Acpt: " + sk.isAcceptable();<br />　 s += ", Cnct: " + sk.isConnectable();<br />　 s += ", Wrt: " + sk.isWritable();<br />　 s += ", Valid: " + sk.isValid();<br />　 s += ", Ops: " + sk.interestOps();<br />　 debug(s);<br />}</p><p><br />/**<br />* @param args the command line arguments<br />*/<br />public static void main (String args[])<br />{<br />　 NBTest nbTest = new NBTest();<br />　 try<br />　 {<br />　 　 nbTest.startServer();<br />　 }<br />　 　 catch(Exception e)<br />　 {<br />　 　 e.printStackTrace();<br />　 }<br />}</p><p>}</p><p><br /></p></td>
						</tr>
				</tbody>
		</table>
		<p align="left">这是一个守候在端口9000的noblock server例子，如果我们编制一个客户端程序，就可以对它进行互动操作，或者使用telnet 主机名　90000 可以链接上。</p>
		<p>当前分布式计算　Web Services盛行天下，这些网络服务的底层都离不开对socket的操作。他们都有一个共同的结构：<br />1. Read request<br />2. Decode request<br />3. Process service<br />4. Encode reply<br />5. Send reply</p>
		<p>经典的网络服务的设计如下图，在每个线程中完成对数据的处理：<br /><img height="167" src="http://www.jdon.com/concurrent/images/classic.jpg" width="400" /></p>
		<p>但这种模式在用户负载增加时，性能将下降非常的快。我们需要重新寻找一个新的方案，保持数据处理的流畅，很显然，事件触发机制是最好的解决办法，当有事件发生时，会触动handler,然后开始数据的处理。</p>
		<p>Reactor模式类似于AWT中的Event处理：<br /><img height="271" src="http://www.jdon.com/concurrent/images/awt.jpg" width="345" /></p>
		<p>
				<strong>Reactor模式参与者</strong>
		</p>
		<p>1.Reactor 负责响应IO事件，一旦发生，广播发送给相应的Handler去处理,这类似于AWT的thread<br />2.Handler 是负责非堵塞行为，类似于AWT ActionListeners；同时负责将handlers与event事件绑定，类似于AWT addActionListener</p>
		<p>如图：<br /><img height="174" src="http://www.jdon.com/concurrent/images/reactor.jpg" width="400" /></p>
		<p>Java的NIO为reactor模式提供了实现的基础机制，它的Selector当发现某个channel有数据时，会通过SlectorKey来告知我们，在此我们实现事件和handler的绑定。</p>
		<p>我们来看看Reactor模式代码:</p>
		<p align="left">
		</p>
		<table cellspacing="0" cellpadding="0" width="100%" bgcolor="#cccccc" border="0">
				<tbody>
						<tr>
								<td>
										<br />public class Reactor implements Runnable{ 
<p>　　final Selector selector;<br />　　final ServerSocketChannel serverSocket;<br /></p><p>　　Reactor(int port) throws IOException {<br />　　　　selector = Selector.open();<br />　　　　serverSocket = ServerSocketChannel.open();<br />　　　　InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(),port);<br />　　　　serverSocket.socket().bind(address);<br /><br />　　　　serverSocket.configureBlocking(false);<br />　　　　//向selector注册该channel<br />　　　　 SelectionKey sk =serverSocket.register(selector,SelectionKey.OP_ACCEPT);<br /><br />　　　　logger.debug("--&gt;Start serverSocket.register!");<br /><br />　　　　//利用sk的attache功能绑定Acceptor 如果有事情，触发Acceptor<br />　　　　sk.attach(new Acceptor());<br />　　　　logger.debug("--&gt;attach(new Acceptor()!");<br />　　}</p><p><br />　　public void run() { // normally in a new Thread<br />　　　　try {<br />　　　　while (!Thread.interrupted())<br />　　　　{<br />　　　　　　selector.select();<br />　　　　　　Set selected = selector.selectedKeys();<br />　　　　　　Iterator it = selected.iterator();<br />　　　　　　//Selector如果发现channel有OP_ACCEPT或READ事件发生，下列遍历就会进行。<br />　　　　　　while (it.hasNext())<br />　　　　　　　　//来一个事件 第一次触发一个accepter线程<br />　　　　　　　　//以后触发SocketReadHandler<br />　　　　　　　　dispatch((SelectionKey)(it.next()));<br />　　　　　　　　selected.clear();<br />　　　　　　}<br />　　　　}catch (IOException ex) {<br />　　　　　　　　logger.debug("reactor stop!"+ex);<br />　　　　}<br />　　}</p><p>　　//运行Acceptor或SocketReadHandler<br />　　void dispatch(SelectionKey k) {<br />　　　　Runnable r = (Runnable)(k.attachment());<br />　　　　if (r != null){<br />　　　　　　// r.run();</p><p>　　　　}<br />　　} </p><p>　　class Acceptor implements Runnable { // inner<br />　　　　public void run() {<br />　　　　try {<br />　　　　　　logger.debug("--&gt;ready for accept!");<br />　　　　　　SocketChannel c = serverSocket.accept();<br />　　　　　　if (c != null)<br />　　　　　　　　//调用Handler来处理channel<br />　　　　　　　　new SocketReadHandler(selector, c);<br />　　　　　　}<br />　　　　catch(IOException ex) {<br />　　　　　　logger.debug("accept stop!"+ex);<br />　　　　}<br />　　　　}<br />　　}<br />}<br /></p></td>
						</tr>
				</tbody>
		</table>
		<p>以上代码中巧妙使用了SocketChannel的attach功能，将Hanlder和可能会发生事件的channel链接在一起，当发生事件时，可以立即触发相应链接的Handler。</p>
		<p>再看看Handler代码:</p>
		<p align="left">
		</p>
		<table cellspacing="0" cellpadding="0" width="100%" bgcolor="#cccccc" border="0">
				<tbody>
						<tr>
								<td>public class SocketReadHandler implements Runnable { 
<p>　　public static Logger logger = Logger.getLogger(SocketReadHandler.class);</p><p>　　private Test test=new Test();</p><p>　　final SocketChannel socket;<br />　　final SelectionKey sk;<br /><br />　　 static final int READING = 0, SENDING = 1;<br />　　int state = READING;</p><p>　　public SocketReadHandler(Selector sel, SocketChannel c)<br />　　　　throws IOException {</p><p>　　　　socket = c;</p><p>　　　　socket.configureBlocking(false);<br />　　　　 sk = socket.register(sel, 0);</p><p>　　　　//将SelectionKey绑定为本Handler 下一步有事件触发时，将调用本类的run方法。<br />　　　　//参看dispatch(SelectionKey k)<br />　　　　sk.attach(this);<br /><br />　　　　//同时将SelectionKey标记为可读，以便读取。<br />　　　　sk.interestOps(SelectionKey.OP_READ);<br />　　　　sel.wakeup();<br />　　}</p><p>　　public void run() {<br />　　　　try{<br />　　　　// test.read(socket,input);<br />　　　　　　readRequest() ;<br />　　　　}catch(Exception ex){<br />　　　　logger.debug("readRequest error"+ex);<br />　　　　}<br />　　}</p><p><br />/**<br />* 处理读取data<br />* @param key<br />* @throws Exception<br />*/<br />private void readRequest() throws Exception {</p><p>　　ByteBuffer input = ByteBuffer.allocate(1024);<br />　　input.clear();<br />　　try{</p><p>　　　　int bytesRead = socket.read(input);</p><p>　　　　...... </p><p>　　　　//激活线程池 处理这些request<br />　　　　requestHandle(new Request(socket,btt));</p><p>　　　　.....</p><p><br />　　}catch(Exception e) {<br />　　}<br /><br />}</p></td>
						</tr>
				</tbody>
		</table>
		<p>注意在Handler里面又执行了一次attach，这样，覆盖前面的Acceptor，下次该Handler又有READ事件发生时，将直接触发Handler.从而开始了数据的读　处理　写　发出等流程处理。</p>
		<p>将数据读出后，可以将这些数据处理线程做成一个线程池，这样，数据读出后，立即扔到线程池中，这样加速处理速度：</p>
		<p>
				<img height="332" src="http://www.jdon.com/concurrent/images/pool.jpg" width="500" />
		</p>
		<p>更进一步，我们可以使用多个Selector分别处理连接和读事件。</p>
		<p>一个高性能的Java网络服务机制就要形成，激动人心的集群并行计算即将实现。</p>
		<p>
				<a href="http://www.jdon.com/concurrent/nio.pdf">Scalable IO in Java原文</a>
		</p>
		<p> </p>
		<!-- #EndEditable -->
		<div id="vgad2">
				<iframe name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-2190557680964036&amp;dt=1165997376265&amp;lmt=1144318857&amp;prev_fmts=120x600_as&amp;format=300x250_as&amp;output=html&amp;channel=2020950433&amp;url=http%3A%2F%2Fwww.jdon.com%2Fconcurrent%2Freactor.htm&amp;color_bg=FFFFFF&amp;color_text=000000&amp;color_link=3273AD&amp;color_url=333333&amp;color_border=FFFFFF&amp;ad_type=text&amp;ref=http%3A%2F%2Fwww.baidu.com%2Fs%3Ftn%3Dmyie2dg%26ie%3Dgb2312%26bs%3Dreactor%25C4%25A3%25CA%25BD%26sr%3D%26z%3D%26cl%3D3%26f%3D8%26wd%3Djava%2Breactor%25C4%25A3%25CA%25BD%26ct%3D0&amp;cc=18&amp;u_h=1024&amp;u_w=1280&amp;u_ah=994&amp;u_aw=1280&amp;u_cd=32&amp;u_tz=480&amp;u_java=true" frameborder="0" width="300" scrolling="no" height="250" allowtransparency="">
				</iframe>
		</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/87514.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2006-12-13 16:15 <a href="http://www.blogjava.net/baoyaer/articles/87514.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式之Observer</title><link>http://www.blogjava.net/baoyaer/articles/86361.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 08 Dec 2006 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/86361.html</guid><description><![CDATA[<p><img height="264" alt="" src="http://www.blogjava.net/images/blogjava_net/baoyaer/7961144d85a5603db2de050e.jpg" width="764" border="0" /><br />
<br />
以上是API<span class="t_tag" onxxxxx="tagshow(event)" href="tag.php?name=%CA%D6%B2%E1">手册</span>里观察者的UML图，（本文主要讨论自己实现观察者模式，JDK内置的就自己百度下吧）从上图中我们可以看出一共需要两个接口，两个具体的实现类，分别是观察者接口，观察者实现类，被观察者接口，被观察者实现类，并且被观察者中会有多个观察者，因此我们想到的是用一个集合框架来储存观察者（例如List），也就是使用组合啦。<br />
<br />
下面的东西通过具体代码来解析给大家听。<br />
场景是有一条变色龙，然后有一堆人在猥琐地注视着它（好可怜哇。。。），当变色龙变色的时候，所有人要将新的颜色记录下来。<br />
<br />
首先是观察者接口 </p>
<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"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;org.black.observer;<br />
<img id="Codehighlighter1_54_96_Open_Image" onclick="this.style.display='none'; Codehighlighter1_54_96_Open_Text.style.display='none'; Codehighlighter1_54_96_Closed_Image.style.display='inline'; Codehighlighter1_54_96_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_54_96_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_54_96_Closed_Text.style.display='none'; Codehighlighter1_54_96_Open_Image.style.display='inline'; Codehighlighter1_54_96_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;Observer&nbsp;</span><span id="Codehighlighter1_54_96_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_54_96_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;update(Object&nbsp;observable);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<span>代码很简单，update方法做的就是当变色龙变色的时候调用的方法，并且因为要知道变色龙的颜色，所以需要传递一个参数，读者会问，那直接传递String color就可以了哇，写成对象的目的是为了防止需求的改变，万一以后变色龙有没有吐舌头都要你记录的时候，你就可以不需要在此方法多加参数了。<br />
<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"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;org.black.observer;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.black.observable.Bsl;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_102_309_Open_Image" onclick="this.style.display='none'; Codehighlighter1_102_309_Open_Text.style.display='none'; Codehighlighter1_102_309_Closed_Image.style.display='inline'; Codehighlighter1_102_309_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_102_309_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_102_309_Closed_Text.style.display='none'; Codehighlighter1_102_309_Open_Image.style.display='inline'; Codehighlighter1_102_309_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Person&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Observer&nbsp;</span><span id="Codehighlighter1_102_309_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_102_309_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;name;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_155_177_Open_Image" onclick="this.style.display='none'; Codehighlighter1_155_177_Open_Text.style.display='none'; Codehighlighter1_155_177_Closed_Image.style.display='inline'; Codehighlighter1_155_177_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_155_177_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_155_177_Closed_Text.style.display='none'; Codehighlighter1_155_177_Open_Image.style.display='inline'; Codehighlighter1_155_177_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Person(String&nbsp;name)</span><span id="Codehighlighter1_155_177_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_155_177_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;name;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_219_306_Open_Image" onclick="this.style.display='none'; Codehighlighter1_219_306_Open_Text.style.display='none'; Codehighlighter1_219_306_Closed_Image.style.display='inline'; Codehighlighter1_219_306_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_219_306_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_219_306_Closed_Text.style.display='none'; Codehighlighter1_219_306_Open_Image.style.display='inline'; Codehighlighter1_219_306_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&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;update(Object&nbsp;observable)&nbsp;</span><span id="Codehighlighter1_219_306_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_219_306_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Bsl&nbsp;bsl&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Bsl)observable;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(name</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">bsl.getColor());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<p><span>这里代码不做多解析，强转的那个地方也是为了应变需求改变，万一以后不仅仅要记录变色龙，还要记录鹦鹉什么的，那接口的代码也就不需要改变了。<br />
<br />
然后是被观察者接口</span></span></p>
<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"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;org.black.observable;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.black.observer.Observer;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_95_227_Open_Image" onclick="this.style.display='none'; Codehighlighter1_95_227_Open_Text.style.display='none'; Codehighlighter1_95_227_Closed_Image.style.display='inline'; Codehighlighter1_95_227_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_95_227_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_95_227_Closed_Text.style.display='none'; Codehighlighter1_95_227_Open_Image.style.display='inline'; Codehighlighter1_95_227_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;Observable&nbsp;</span><span id="Codehighlighter1_95_227_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_95_227_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;addObserver(Observer&nbsp;observer);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;removeObserver(Observer&nbsp;observer);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;notifyAllObserver();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>&nbsp;</p>
<p><span>这里前两个方法为的就是添加观察者和除去观察者呗，通知方法就是当状态改变的时候，要告知所有的观察者，这里可能有点懵，看了实现类就很容易懂了。<br />
<br />
下面是被观察者实现类 </span></p>
<p>&nbsp;</p>
<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"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;org.black.observable;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.ArrayList;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.List;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.black.observer.Observer;<br />
<img id="Codehighlighter1_156_742_Open_Image" onclick="this.style.display='none'; Codehighlighter1_156_742_Open_Text.style.display='none'; Codehighlighter1_156_742_Closed_Image.style.display='inline'; Codehighlighter1_156_742_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_156_742_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_156_742_Closed_Text.style.display='none'; Codehighlighter1_156_742_Open_Image.style.display='inline'; Codehighlighter1_156_742_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Bsl&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Observable&nbsp;</span><span id="Codehighlighter1_156_742_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_156_742_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;color&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">绿色</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Observer</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;observerList&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArrayList</span><span style="color: #000000">&lt;</span><span style="color: #000000">Observer</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_297_327_Open_Image" onclick="this.style.display='none'; Codehighlighter1_297_327_Open_Text.style.display='none'; Codehighlighter1_297_327_Closed_Image.style.display='inline'; Codehighlighter1_297_327_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_297_327_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_297_327_Closed_Text.style.display='none'; Codehighlighter1_297_327_Open_Image.style.display='inline'; Codehighlighter1_297_327_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;addObserver(Observer&nbsp;observer)&nbsp;</span><span id="Codehighlighter1_297_327_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_297_327_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />observerList.add(observer);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_375_408_Open_Image" onclick="this.style.display='none'; Codehighlighter1_375_408_Open_Text.style.display='none'; Codehighlighter1_375_408_Closed_Image.style.display='inline'; Codehighlighter1_375_408_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_375_408_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_375_408_Closed_Text.style.display='none'; Codehighlighter1_375_408_Open_Image.style.display='inline'; Codehighlighter1_375_408_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;removeObserver(Observer&nbsp;observer)&nbsp;</span><span id="Codehighlighter1_375_408_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_375_408_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />observerList.remove(observer);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_443_516_Open_Image" onclick="this.style.display='none'; Codehighlighter1_443_516_Open_Text.style.display='none'; Codehighlighter1_443_516_Closed_Image.style.display='inline'; Codehighlighter1_443_516_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_443_516_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_443_516_Closed_Text.style.display='none'; Codehighlighter1_443_516_Open_Image.style.display='inline'; Codehighlighter1_443_516_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;notifyAllObserver()&nbsp;</span><span id="Codehighlighter1_443_516_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_443_516_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_482_510_Open_Image" onclick="this.style.display='none'; Codehighlighter1_482_510_Open_Text.style.display='none'; Codehighlighter1_482_510_Closed_Image.style.display='inline'; Codehighlighter1_482_510_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_482_510_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_482_510_Closed_Text.style.display='none'; Codehighlighter1_482_510_Open_Image.style.display='inline'; Codehighlighter1_482_510_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">for</span><span style="color: #000000">(Observer&nbsp;observer&nbsp;:&nbsp;observerList)</span><span id="Codehighlighter1_482_510_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_482_510_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;observer.update(</span><span style="color: #0000ff">this</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_555_637_Open_Image" onclick="this.style.display='none'; Codehighlighter1_555_637_Open_Text.style.display='none'; Codehighlighter1_555_637_Closed_Image.style.display='inline'; Codehighlighter1_555_637_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_555_637_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_555_637_Closed_Text.style.display='none'; Codehighlighter1_555_637_Open_Image.style.display='inline'; Codehighlighter1_555_637_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;changeColor(String&nbsp;color)</span><span id="Codehighlighter1_555_637_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_555_637_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">this</span><span style="color: #000000">.color&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;color;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />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">color);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />notifyAllObserver();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_665_681_Open_Image" onclick="this.style.display='none'; Codehighlighter1_665_681_Open_Text.style.display='none'; Codehighlighter1_665_681_Closed_Image.style.display='inline'; Codehighlighter1_665_681_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_665_681_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_665_681_Closed_Text.style.display='none'; Codehighlighter1_665_681_Open_Image.style.display='inline'; Codehighlighter1_665_681_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getColor()&nbsp;</span><span id="Codehighlighter1_665_681_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_665_681_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;color;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_718_740_Open_Image" onclick="this.style.display='none'; Codehighlighter1_718_740_Open_Text.style.display='none'; Codehighlighter1_718_740_Closed_Image.style.display='inline'; Codehighlighter1_718_740_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_718_740_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_718_740_Closed_Text.style.display='none'; Codehighlighter1_718_740_Open_Image.style.display='inline'; Codehighlighter1_718_740_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setColor(String&nbsp;color)&nbsp;</span><span id="Codehighlighter1_718_740_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_718_740_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">this</span><span style="color: #000000">.color&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;color;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p><span>在这里，color就是被观察者的状态啦，当这个状态改变的时候就必须告诉所有的观察者，所以changeColor里面需要调用notifyAllObserver<br />
</span>下面是主函数 <br />
</p>
<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"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;org.black.test;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.black.observable.Bsl;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.black.observer.Observer;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.black.observer.Person;<br />
<img id="Codehighlighter1_153_601_Open_Image" onclick="this.style.display='none'; Codehighlighter1_153_601_Open_Text.style.display='none'; Codehighlighter1_153_601_Closed_Image.style.display='inline'; Codehighlighter1_153_601_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_153_601_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_153_601_Closed_Text.style.display='none'; Codehighlighter1_153_601_Open_Image.style.display='inline'; Codehighlighter1_153_601_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TestObserver&nbsp;</span><span id="Codehighlighter1_153_601_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_153_601_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_155_174_Open_Image" onclick="this.style.display='none'; Codehighlighter1_155_174_Open_Text.style.display='none'; Codehighlighter1_155_174_Closed_Image.style.display='inline'; Codehighlighter1_155_174_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_155_174_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_155_174_Closed_Text.style.display='none'; Codehighlighter1_155_174_Open_Image.style.display='inline'; Codehighlighter1_155_174_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_155_174_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_155_174_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;args<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_215_599_Open_Image" onclick="this.style.display='none'; Codehighlighter1_215_599_Open_Text.style.display='none'; Codehighlighter1_215_599_Closed_Image.style.display='inline'; Codehighlighter1_215_599_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_215_599_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_215_599_Closed_Text.style.display='none'; Codehighlighter1_215_599_Open_Image.style.display='inline'; Codehighlighter1_215_599_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></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;</span><span id="Codehighlighter1_215_599_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_215_599_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />Bsl&nbsp;bsl&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Bsl();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />Observer&nbsp;p1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Person(</span><span style="color: #000000">"</span><span style="color: #000000">hjq</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />Observer&nbsp;p2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Person(</span><span style="color: #000000">"</span><span style="color: #000000">zz</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />bsl.addObserver(p1);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />bsl.addObserver(p2);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />bsl.changeColor(</span><span style="color: #000000">"</span><span style="color: #000000">黄色</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />bsl.removeObserver(p2);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_428_570_Open_Image" onclick="this.style.display='none'; Codehighlighter1_428_570_Open_Text.style.display='none'; Codehighlighter1_428_570_Closed_Image.style.display='inline'; Codehighlighter1_428_570_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_428_570_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_428_570_Closed_Text.style.display='none'; Codehighlighter1_428_570_Open_Image.style.display='inline'; Codehighlighter1_428_570_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />bsl.addObserver(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Observer()</span><span id="Codehighlighter1_428_570_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_428_570_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_471_564_Open_Image" onclick="this.style.display='none'; Codehighlighter1_471_564_Open_Text.style.display='none'; Codehighlighter1_471_564_Closed_Image.style.display='inline'; Codehighlighter1_471_564_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_471_564_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_471_564_Closed_Text.style.display='none'; Codehighlighter1_471_564_Open_Image.style.display='inline'; Codehighlighter1_471_564_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&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;update(Object&nbsp;observable)&nbsp;</span><span id="Codehighlighter1_471_564_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_471_564_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Bsl&nbsp;bsl&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Bsl)observable;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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">+</span><span style="color: #000000">bsl.getColor());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />bsl.changeColor(</span><span style="color: #000000">"</span><span style="color: #000000">红色</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>&nbsp;</p>
<p><span>匿名类的写法相信大家一定非常熟悉了，很像SWING里面的addListener，很方便，遗憾的是，不能知道名字，也没办法remove了。<br />
<br />
结果是 </span></p>
<p><span><br />
变色龙将颜色变为：黄色<br />
hjq记录了变色龙的颜色为:黄色<br />
zz记录了变色龙的颜色为:黄色<br />
变色龙将颜色变为：红色<br />
hjq记录了变色龙的颜色为:红色<br />
无名氏记录了变色龙的颜色为:红色</span></p>
<p><span>大家多多支持。。以后会推出更多的<span class="t_tag" onxxxxx="tagshow(event)" href="tag.php?name=%C9%E8%BC%C6%C4%A3%CA%BD">设计模式</span>的代码，力求简单生动，易于理解。。<br />
</span></p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/86361.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2006-12-08 15:32 <a href="http://www.blogjava.net/baoyaer/articles/86361.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java IOC设计模式</title><link>http://www.blogjava.net/baoyaer/articles/86337.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 08 Dec 2006 06:31:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/86337.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/86337.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/86337.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/86337.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/86337.html</trackback:ping><description><![CDATA[
		<br /> IoC模式简介 <br /><br />   IoC（Inversion of Control）模式并不是什么新的东西，它是一种很普遍的概念，依赖注入（Dependency Injection）是Martin Flower对IoC模式的一种扩展的解释[2]。IoC是一种用来解决组件（实际上也可以是简单的Java类）之间依赖关系、配置及生命周期的设计模式，其中对组件依赖关系的处理是IoC的精华部分。IoC的实际意义就是把组件之间的依赖关系提取（反转）出来，由容器来具体配置。这样，各个组件之间就不存在hard-code的关联，任何组件都可以最大程度的得到重用。运用了IoC模式后我们不再需要自己管理组件之间的依赖关系，只需要声明由容器去实现这种依赖关系。就好像把对组件之间依赖关系的控制进行了倒置，不再由组件自己来建立这种依赖关系而交给容器（例如我们后面会介绍的PicoContainer、Spring）去管理。 <br /><br />   我们从一个简单的例子看起，考虑一个Button控制Lamp的例子： <br /><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"><img id="Codehighlighter1_20_105_Open_Image" onclick="this.style.display='none'; Codehighlighter1_20_105_Open_Text.style.display='none'; Codehighlighter1_20_105_Closed_Image.style.display='inline'; Codehighlighter1_20_105_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_20_105_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_20_105_Closed_Text.style.display='none'; Codehighlighter1_20_105_Open_Image.style.display='inline'; Codehighlighter1_20_105_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Button </span><span id="Codehighlighter1_20_105_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_20_105_Open_Text"><span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> Lamp lamp; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_70_101_Open_Image" onclick="this.style.display='none'; Codehighlighter1_70_101_Open_Text.style.display='none'; Codehighlighter1_70_101_Closed_Image.style.display='inline'; Codehighlighter1_70_101_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_70_101_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_70_101_Closed_Text.style.display='none'; Codehighlighter1_70_101_Open_Image.style.display='inline'; Codehighlighter1_70_101_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> push() </span><span id="Codehighlighter1_70_101_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_70_101_Open_Text"><span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       lamp.turnOn(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />   }</span></span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />   但是马上发现这个设计的问题，Button类直接依赖于Lamp类，这个依赖关系意味着当Lamp类修改时，Button类会受到影响。此外，想重用Button类来控制类似与Lamp的（比如同样具有turnOn功能的Computer）另外一个对象则是不可能的。即Button控制Lamp，并且只能控制Lamp。显然违反了“高层模块不应该依赖于低层模块，两者都应该依赖于抽象；抽象不应该依赖于具体实现，细节应该依赖于抽象” 这一原则（DIP原则）。考虑到上述问题，自然的想到应该抽象出一个接口SwitchableDevice，来消除Button对Lamp的依赖，于是设计如下： <br /><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"><img id="Codehighlighter1_20_112_Open_Image" onclick="this.style.display='none'; Codehighlighter1_20_112_Open_Text.style.display='none'; Codehighlighter1_20_112_Closed_Image.style.display='inline'; Codehighlighter1_20_112_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_20_112_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_20_112_Closed_Text.style.display='none'; Codehighlighter1_20_112_Open_Image.style.display='inline'; Codehighlighter1_20_112_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Button </span><span id="Codehighlighter1_20_112_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_20_112_Open_Text"><span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> SwitchableDevice lamp; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_78_108_Open_Image" onclick="this.style.display='none'; Codehighlighter1_78_108_Open_Text.style.display='none'; Codehighlighter1_78_108_Closed_Image.style.display='inline'; Codehighlighter1_78_108_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_78_108_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_78_108_Closed_Text.style.display='none'; Codehighlighter1_78_108_Open_Image.style.display='inline'; Codehighlighter1_78_108_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Button()</span><span id="Codehighlighter1_78_108_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_78_108_Open_Text"><span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   lamp</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Lamp(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />   }</span></span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br /><br /><br /><img src ="http://www.blogjava.net/baoyaer/aggbug/86337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2006-12-08 14:31 <a href="http://www.blogjava.net/baoyaer/articles/86337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java代理模式 (转) </title><link>http://www.blogjava.net/baoyaer/articles/84080.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 28 Nov 2006 08:11:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/84080.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/84080.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/84080.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/84080.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/84080.html</trackback:ping><description><![CDATA[
		<p>1. 代理模式 <br />代理模式的作用是：为其他对象提供一种代理以控制对这个对象的访问。在某些情况下，一个客户不想或者不能直接引用另一个对象，而代理对象可以在客户端和目标对象之间起到中介的作用。 <br />代理模式一般涉及到三个角色： <br />抽象角色：声明真实对象和代理对象的共同接口； <br />代理角色：代理对象角色内部含有对真实对象的引用，从而可以操作真实对象，同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时，代理对象可以在执行真实对象操作时，附加其他的操作，相当于对真实对象进行封装。 <br />真实角色：代理角色所代表的真实对象，是我们最终要引用的对象。</p>
		<p>以下以《Java与模式》中的示例为例： </p>
		<p>抽象角色： <br /></p>
		<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">
				<img id="Codehighlighter1_30_68_Open_Image" onclick="this.style.display='none'; Codehighlighter1_30_68_Open_Text.style.display='none'; Codehighlighter1_30_68_Closed_Image.style.display='inline'; Codehighlighter1_30_68_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_30_68_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_30_68_Closed_Text.style.display='none'; Codehighlighter1_30_68_Open_Image.style.display='inline'; Codehighlighter1_30_68_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">abstract</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> Subject </span>
				<span id="Codehighlighter1_30_68_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_30_68_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span>
						<span style="COLOR: #0000ff">abstract</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"> request(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<p>
				<br />真实角色：实现了Subject的request()方法。 <br /></p>
		<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">
				<img id="Codehighlighter1_41_166_Open_Image" onclick="this.style.display='none'; Codehighlighter1_41_166_Open_Text.style.display='none'; Codehighlighter1_41_166_Closed_Image.style.display='inline'; Codehighlighter1_41_166_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_41_166_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_41_166_Closed_Text.style.display='none'; Codehighlighter1_41_166_Open_Image.style.display='inline'; Codehighlighter1_41_166_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> RealSubject </span>
				<span style="COLOR: #0000ff">extends</span>
				<span style="COLOR: #000000"> Subject </span>
				<span id="Codehighlighter1_41_166_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_41_166_Open_Text">
						<span style="COLOR: #000000">{ <br /><img id="Codehighlighter1_69_71_Open_Image" onclick="this.style.display='none'; Codehighlighter1_69_71_Open_Text.style.display='none'; Codehighlighter1_69_71_Closed_Image.style.display='inline'; Codehighlighter1_69_71_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_69_71_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_69_71_Closed_Text.style.display='none'; Codehighlighter1_69_71_Open_Image.style.display='inline'; Codehighlighter1_69_71_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> RealSubject() </span>
						<span id="Codehighlighter1_69_71_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_69_71_Open_Text">
								<span style="COLOR: #000000">{ }</span>
						</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img id="Codehighlighter1_105_163_Open_Image" onclick="this.style.display='none'; Codehighlighter1_105_163_Open_Text.style.display='none'; Codehighlighter1_105_163_Closed_Image.style.display='inline'; Codehighlighter1_105_163_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_105_163_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_105_163_Closed_Text.style.display='none'; Codehighlighter1_105_163_Open_Image.style.display='inline'; Codehighlighter1_105_163_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> request() </span>
						<span id="Codehighlighter1_105_163_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_105_163_Open_Text">
								<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">From real subject.</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<p>
				<br />代理角色： <br /></p>
		<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">
				<img id="Codehighlighter1_42_391_Open_Image" onclick="this.style.display='none'; Codehighlighter1_42_391_Open_Text.style.display='none'; Codehighlighter1_42_391_Closed_Image.style.display='inline'; Codehighlighter1_42_391_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_42_391_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_42_391_Closed_Text.style.display='none'; Codehighlighter1_42_391_Open_Image.style.display='inline'; Codehighlighter1_42_391_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> ProxySubject </span>
				<span style="COLOR: #0000ff">extends</span>
				<span style="COLOR: #000000"> Subject </span>
				<span id="Codehighlighter1_42_391_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_42_391_Open_Text">
						<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> RealSubject realSubject; </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">以真实角色作为代理角色的属性 </span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">
								<br />
								<img id="Codehighlighter1_127_129_Open_Image" onclick="this.style.display='none'; Codehighlighter1_127_129_Open_Text.style.display='none'; Codehighlighter1_127_129_Closed_Image.style.display='inline'; Codehighlighter1_127_129_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_127_129_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_127_129_Closed_Text.style.display='none'; Codehighlighter1_127_129_Open_Image.style.display='inline'; Codehighlighter1_127_129_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> ProxySubject() </span>
						<span id="Codehighlighter1_127_129_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_127_129_Open_Text">
								<span style="COLOR: #000000">{ }</span>
						</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_160_388_Open_Image" onclick="this.style.display='none'; Codehighlighter1_160_388_Open_Text.style.display='none'; Codehighlighter1_160_388_Closed_Image.style.display='inline'; Codehighlighter1_160_388_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_160_388_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_160_388_Closed_Text.style.display='none'; Codehighlighter1_160_388_Open_Image.style.display='inline'; Codehighlighter1_160_388_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> request() </span>
						<span id="Codehighlighter1_160_388_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_160_388_Open_Text">
								<span style="COLOR: #000000">{ </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">该方法封装了真实对象的request方法 </span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">        preRequest(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_244_302_Open_Image" onclick="this.style.display='none'; Codehighlighter1_244_302_Open_Text.style.display='none'; Codehighlighter1_244_302_Closed_Image.style.display='inline'; Codehighlighter1_244_302_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_244_302_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_244_302_Closed_Text.style.display='none'; Codehighlighter1_244_302_Open_Image.style.display='inline'; Codehighlighter1_244_302_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000">( realSubject </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">null</span>
								<span style="COLOR: #000000"> ) </span>
								<span id="Codehighlighter1_244_302_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_244_302_Open_Text">
										<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            realSubject </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">new</span>
										<span style="COLOR: #000000"> RealSubject(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        realSubject.request(); </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">此处执行真实对象的request方法 </span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        postRequest(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
				</span>
		</div>
		<p>
				<br />  客户端调用： <br /></p>
		<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">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">Subject sub</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> ProxySubject(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Sub.request(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<p>由以上代码可以看出，客户实际需要调用的是RealSubject类的request()方法，现在用ProxySubject来代理 RealSubject类，同样达到目的，同时还封装了其他方法(preRequest(),postRequest())，可以处理一些其他问题。 </p>
		<p>另外，如果要按照上述的方法使用代理模式，那么真实角色必须是事先已经存在的，并将其作为代理对象的内部属性。但是实际使用时，一个真实角色必须对应一个 代理角色，如果大量使用会导致类的急剧膨胀；此外，如果事先并不知道真实角色，该如何使用代理呢？这个问题可以通过Java的动态代理类来解决。<br /> <br />2.动态代理类 </p>
		<p>Java动态代理类位于Java.lang.reflect包下，一般主要涉及到以下两个类： </p>
		<p>(1). Interface InvocationHandler：该接口中仅定义了一个方法Object：invoke(Object obj,Method method, Object[] args)。在实际使用时，第一个参数obj一般是指代理类，method是被代理的方法，如上例中的request()，args为该方法的参数数组。 这个抽象方法在代理类中动态实现。 </p>
		<p>
				<br />(2).Proxy：该类即为动态代理类，作用类似于上例中的ProxySubject，其中主要包含以下内容： </p>
		<p>Protected Proxy(InvocationHandler h)：构造函数，估计用于给内部的h赋值。 </p>
		<p>Static Class getProxyClass (ClassLoader loader, Class[] interfaces)：获得一个代理类，其中loader是类装载器，interfaces是真实类所拥有的全部接口的数组。 </p>
		<p>Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)：返回代理类的一个实例，返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)。 </p>
		<p> </p>
		<p>所谓Dynamic Proxy是这样一种class：它是在运行时生成的class，在生成它时你必须提供一组interface给它，然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦，这个Dynamic Proxy其实就是一个Proxy，它不会替你作实质性的工作，在生成它的实例时你必须提供一个handler，由它接管实际的工作。</p>
		<p>在使用动态代理类时，我们必须实现InvocationHandler接口，以第一节中的示例为例： </p>
		<p>
		</p>
		<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">
				<br />
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">抽象角色(之前是抽象类，此处应改为接口)： <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_49_88_Open_Image" onclick="this.style.display='none'; Codehighlighter1_49_88_Open_Text.style.display='none'; Codehighlighter1_49_88_Closed_Image.style.display='inline'; Codehighlighter1_49_88_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_49_88_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_49_88_Closed_Text.style.display='none'; Codehighlighter1_49_88_Open_Image.style.display='inline'; Codehighlighter1_49_88_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">interface</span>
				<span style="COLOR: #000000"> Subject </span>
				<span id="Codehighlighter1_49_88_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_49_88_Open_Text">
						<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span>
						<span style="COLOR: #0000ff">abstract</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"> request(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><br /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />具体角色RealSubject：<br /><img id="Codehighlighter1_152_257_Open_Image" onclick="this.style.display='none'; Codehighlighter1_152_257_Open_Text.style.display='none'; Codehighlighter1_152_257_Closed_Image.style.display='inline'; Codehighlighter1_152_257_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_152_257_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_152_257_Closed_Text.style.display='none'; Codehighlighter1_152_257_Open_Image.style.display='inline'; Codehighlighter1_152_257_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> RealSubject </span>
				<span style="COLOR: #0000ff">implements</span>
				<span style="COLOR: #000000"> Subject</span>
				<span id="Codehighlighter1_152_257_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_152_257_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_177_178_Open_Image" onclick="this.style.display='none'; Codehighlighter1_177_178_Open_Text.style.display='none'; Codehighlighter1_177_178_Closed_Image.style.display='inline'; Codehighlighter1_177_178_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_177_178_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_177_178_Closed_Text.style.display='none'; Codehighlighter1_177_178_Open_Image.style.display='inline'; Codehighlighter1_177_178_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> RealSubject()</span>
						<span id="Codehighlighter1_177_178_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_177_178_Open_Text">
								<span style="COLOR: #000000">{}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img id="Codehighlighter1_204_254_Open_Image" onclick="this.style.display='none'; Codehighlighter1_204_254_Open_Text.style.display='none'; Codehighlighter1_204_254_Closed_Image.style.display='inline'; Codehighlighter1_204_254_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_204_254_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_204_254_Closed_Text.style.display='none'; Codehighlighter1_204_254_Open_Image.style.display='inline'; Codehighlighter1_204_254_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> request()</span>
						<span id="Codehighlighter1_204_254_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_204_254_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    System.out.println(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">From real subject.</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<p>
				<br />代理处理器： <br /></p>
		<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">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.lang.reflect.Method;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.lang.reflect.InvocationHandler;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_136_482_Open_Image" onclick="this.style.display='none'; Codehighlighter1_136_482_Open_Text.style.display='none'; Codehighlighter1_136_482_Closed_Image.style.display='inline'; Codehighlighter1_136_482_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_136_482_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_136_482_Closed_Text.style.display='none'; Codehighlighter1_136_482_Open_Image.style.display='inline'; Codehighlighter1_136_482_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> DynamicSubject </span>
				<span style="COLOR: #0000ff">implements</span>
				<span style="COLOR: #000000"> InvocationHandler </span>
				<span id="Codehighlighter1_136_482_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_136_482_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> Object sub;<br /><img id="Codehighlighter1_186_187_Open_Image" onclick="this.style.display='none'; Codehighlighter1_186_187_Open_Text.style.display='none'; Codehighlighter1_186_187_Closed_Image.style.display='inline'; Codehighlighter1_186_187_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_186_187_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_186_187_Closed_Text.style.display='none'; Codehighlighter1_186_187_Open_Image.style.display='inline'; Codehighlighter1_186_187_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> DynamicSubject() </span>
						<span id="Codehighlighter1_186_187_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_186_187_Open_Text">
								<span style="COLOR: #000000">{}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img id="Codehighlighter1_226_245_Open_Image" onclick="this.style.display='none'; Codehighlighter1_226_245_Open_Text.style.display='none'; Codehighlighter1_226_245_Closed_Image.style.display='inline'; Codehighlighter1_226_245_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_226_245_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_226_245_Closed_Text.style.display='none'; Codehighlighter1_226_245_Open_Image.style.display='inline'; Codehighlighter1_226_245_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> DynamicSubject(Object obj) </span>
						<span id="Codehighlighter1_226_245_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_226_245_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    sub </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> obj;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img id="Codehighlighter1_330_479_Open_Image" onclick="this.style.display='none'; Codehighlighter1_330_479_Open_Text.style.display='none'; Codehighlighter1_330_479_Closed_Image.style.display='inline'; Codehighlighter1_330_479_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_330_479_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_330_479_Closed_Text.style.display='none'; Codehighlighter1_330_479_Open_Image.style.display='inline'; Codehighlighter1_330_479_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> Object invoke(Object proxy, Method method, Object[] args) </span>
						<span style="COLOR: #0000ff">throws</span>
						<span style="COLOR: #000000"> Throwable </span>
						<span id="Codehighlighter1_330_479_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_330_479_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   System.out.println(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">before calling </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000"> method);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   method.invoke(sub,args);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   System.out.println(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">after calling </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000"> method);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">null</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p> </p>
		<p>该代理类的内部属性为Object类，实际使用时通过该类的构造函数DynamicSubject(Object obj)对其赋值；此外，在该类还实现了invoke方法，该方法中的 </p>
		<p>method.invoke(sub,args); </p>
		<p>其实就是调用被代理对象的将要被执行的方法，方法参数sub是实际的被代理对象，args为执行被代理对象相应操作所需的参数。通过动态代理类，我们可以在调用之前或之后执行一些相关操作。 </p>
		<p>客户端： </p>
		<p>
		</p>
		<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">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.lang.reflect.InvocationHandler; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.lang.reflect.Proxy; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.lang.reflect.Constructor; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.lang.reflect.Method; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_172_518_Open_Image" onclick="this.style.display='none'; Codehighlighter1_172_518_Open_Text.style.display='none'; Codehighlighter1_172_518_Closed_Image.style.display='inline'; Codehighlighter1_172_518_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_172_518_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_172_518_Closed_Text.style.display='none'; Codehighlighter1_172_518_Open_Image.style.display='inline'; Codehighlighter1_172_518_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> Client </span>
				<span id="Codehighlighter1_172_518_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_172_518_Open_Text">
						<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_232_514_Open_Image" onclick="this.style.display='none'; Codehighlighter1_232_514_Open_Text.style.display='none'; Codehighlighter1_232_514_Closed_Image.style.display='inline'; Codehighlighter1_232_514_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_232_514_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_232_514_Closed_Text.style.display='none'; Codehighlighter1_232_514_Open_Image.style.display='inline'; Codehighlighter1_232_514_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span>
						<span style="COLOR: #0000ff">static</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"> main(String[] args) </span>
						<span style="COLOR: #0000ff">throws</span>
						<span style="COLOR: #000000"> Throwable </span>
						<span id="Codehighlighter1_232_514_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_232_514_Open_Text">
								<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   RealSubject rs </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> RealSubject(); </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">在这里指定被代理类 </span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">   InvocationHandler ds </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> DynamicSubject(rs); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   Class cls </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> rs.getClass(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">以下是一次性生成代理</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">   Subject subject </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> (Subject) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(),ds ); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   subject.request(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span>
				</span>
		</div>
		<p>程序运行结果：<br /><font color="#ff0000">before calling public abstract void Subject.request()<br />From real subject.<br />after calling public abstract void Subject.request()</font></p>
		<p>通过这种方式，被代理的对象(RealSubject)可以在运行时动态改变，需要控制的接口(Subject接口)可以在运行时改变，控制的方式(DynamicSubject类)也可以动态改变，从而实现了非常灵活的动态代理关系。<br /></p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/84080.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2006-11-28 16:11 <a href="http://www.blogjava.net/baoyaer/articles/84080.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>