??xml version="1.0" encoding="utf-8" standalone="yes"?>美女的诞生在线观看高清免费完整版中文 ,欧美国产精品一区二区,成年人在线网站http://www.aygfsteel.com/baoyaer/category/18354.htmljavazh-cnFri, 19 Mar 2010 21:58:51 GMTFri, 19 Mar 2010 21:58:51 GMT60jdonjive分析Q?Q缓存机?/title><link>http://www.aygfsteel.com/baoyaer/articles/172389.html</link><dc:creator>大田?/dc:creator><author>大田?/author><pubDate>Thu, 03 Jan 2008 02:35:00 GMT</pubDate><guid>http://www.aygfsteel.com/baoyaer/articles/172389.html</guid><wfw:comment>http://www.aygfsteel.com/baoyaer/comments/172389.html</wfw:comment><comments>http://www.aygfsteel.com/baoyaer/articles/172389.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/baoyaer/comments/commentRss/172389.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/baoyaer/services/trackbacks/172389.html</trackback:ping><description><![CDATA[     摘要:  Jive的缓存机?Jive论坛的一个主要特点就是其性能速度快,因此很多巨大讉K量的|站都采用了Jive论坛。这些都是由于Jive采取了高速缓存机制?~存QCacheQ机制是提高pȝq行性能必不可少的技术。缓存机制从原理上讲比较单,是在原始数据第一ơ读取后 保存在内存中Q下ơ读取时Q就直接从内存中d。原始数据有可能保存在持久化介质或网l上。缓存机制也?代理模式的一U实...  <a href='http://www.aygfsteel.com/baoyaer/articles/172389.html'>阅读全文</a><img src ="http://www.aygfsteel.com/baoyaer/aggbug/172389.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/baoyaer/" target="_blank">大田?/a> 2008-01-03 10:35 <a href="http://www.aygfsteel.com/baoyaer/articles/172389.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JdonJive论坛设计模式分析(3) ---安全理机制http://www.aygfsteel.com/baoyaer/articles/172372.html大田?/dc:creator>大田?/author>Thu, 03 Jan 2008 01:53:00 GMThttp://www.aygfsteel.com/baoyaer/articles/172372.htmlhttp://www.aygfsteel.com/baoyaer/comments/172372.htmlhttp://www.aygfsteel.com/baoyaer/articles/172372.html#Feedback0http://www.aygfsteel.com/baoyaer/comments/commentRss/172372.htmlhttp://www.aygfsteel.com/baoyaer/services/trackbacks/172372.html阅读全文

]]>
JdonJive论坛设计模式分析(2) http://www.aygfsteel.com/baoyaer/articles/171423.html大田?/dc:creator>大田?/author>Sat, 29 Dec 2007 02:17:00 GMThttp://www.aygfsteel.com/baoyaer/articles/171423.htmlhttp://www.aygfsteel.com/baoyaer/comments/171423.htmlhttp://www.aygfsteel.com/baoyaer/articles/171423.html#Feedback0http://www.aygfsteel.com/baoyaer/comments/commentRss/171423.htmlhttp://www.aygfsteel.com/baoyaer/services/trackbacks/171423.html阅读全文

]]>
JdonJive论坛设计模式分析(1) http://www.aygfsteel.com/baoyaer/articles/171408.html大田?/dc:creator>大田?/author>Sat, 29 Dec 2007 01:34:00 GMThttp://www.aygfsteel.com/baoyaer/articles/171408.htmlhttp://www.aygfsteel.com/baoyaer/comments/171408.htmlhttp://www.aygfsteel.com/baoyaer/articles/171408.html#Feedback0http://www.aygfsteel.com/baoyaer/comments/commentRss/171408.htmlhttp://www.aygfsteel.com/baoyaer/services/trackbacks/171408.html阅读全文

]]>
设计模式解Q百度上的一文章) http://www.aygfsteel.com/baoyaer/articles/166994.html大田?/dc:creator>大田?/author>Tue, 11 Dec 2007 09:25:00 GMThttp://www.aygfsteel.com/baoyaer/articles/166994.htmlhttp://www.aygfsteel.com/baoyaer/comments/166994.htmlhttp://www.aygfsteel.com/baoyaer/articles/166994.html#Feedback0http://www.aygfsteel.com/baoyaer/comments/commentRss/166994.htmlhttp://www.aygfsteel.com/baoyaer/services/trackbacks/166994.htmlFactory
Singleton(单?
Builder
Prototype(原型)
Flyweight
Bridge
Decorator(Ҏ?
Composite(l合)
Adapter(适配?
Proxy(代理)
Facade(外观 ȝ Manager)
Visitor
Observer
1、FACTORY?qMM不了请吃饭了,麦当劳的鸡翅和肯德基的鸡都是MM爱吃的东西,虽然口味有所不同Q但不管你带MM去麦当劳或肯德基Q只向服务员说“来四个鸡?#8221;p了。麦当劳和肯德基是生鸡翅的Factory 工厂模式Q客L和工厂类分开。消费者Q何时候需要某U品,只需向工厂请求即可。消费者无M改就可以接纳C品。缺Ҏ当品修ҎQ工厂类也要做相应的修改。如Q如何创建及如何向客L提供?

2、BUILDER?MM最爱听的就?#8220;我爱?#8221;q句话了Q见C同地方的MM,要能够用她们的方a跟她说这句话哦,我有一个多U语a译机,上面每种语言都有一个按键,见到MM我只要按对应的键Q它p够用相应的语a说出“我爱?#8221;q句话了Q国外的MM也可以轻松搞掂,q就是我?#8220;我爱?#8221;builder。(q一定比军在伊拉克用的译机好卖) 建造模式:品的内部表象和品的生成q程分割开来,从而一个徏造过E生成具有不同的内部表象的品对象。徏造模式得品内部表象可以独立的变化Q客户不必知道品内部组成的l节。徏造模式可以强制实行一U分步骤q行的徏造过E?

3、FACTORY METHOD?请MM去麦当劳吃汉堡,不同的MM有不同的口味Q要每个都记住是一件烦人的事情Q我一般采用Factory Method模式Q带着MM到服务员那儿Q说“要一个汉?#8221;Q具体要什么样的汉堡呢Q让MM直接跟服务员说就行了?工厂Ҏ模式Q核心工厂类不再负责所有品的创徏Q而是具体创建的工作交给子类dQ成Z个抽象工厂角Ԍ仅负责给出具体工厂类必须实现的接口,而不接触哪一个品类应当被实例化q种l节?

4、PROTOTYPE?跟MM用QQ聊天Q一定要说些深情的话语了Q我搜集了好多肉ȝ情话Q需要时只要copy出来攑ֈQQ里面p了,q就是我的情话prototype了。(100块钱一份,你要不要Q?原始模型模式Q通过l出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的Ҏ创徏出更多同cd的对象。原始模型模式允许动态的增加或减品类Q品类不需要非得有M事先定的等U结构,原始模型模式适用于Q何的{l构。缺Ҏ每一个类都必配备一个克隆方法?

5、SINGLETON?俺有6个漂亮的老婆Q她们的老公都是我,我就是我们家里的老公SigletonQ她们只要说?#8220;老公”Q都是指的同一个hQ那是?刚才做了个梦啦,哪有q么好的? 单例模式Q单例模式确保某一个类只有一个实例,而且自行实例化ƈ向整个系l提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用?[b:9ceca65206]l构型模式[/b:9ceca65206]

6、ADAPTER?在朋友聚会上到了一个美女SarahQ从香港来的Q可我不会说_语Q她不会说普通话Q只好求助于我的朋友kent了,他作为我和Sarah之间的AdapterQ让我和Sarah可以怺交谈?也不知道他会不会耍我) 适配器(变压器)模式Q把一个类的接口变换成客户端所期待的另一U接口,从而原本因接口原因不匚w而无法一起工作的两个c能够一起工作。适配cd以根据参数返q一个合适的实例l客L?

7、BRIDGE?早上到MMQ要说早上好Q晚上碰到MMQ要说晚上好Q碰到MMI了件新服Q要说你的衣服好漂亮哦,到MM新做的发型,要说你的头发好漂亮哦。不要问?#8220;早上到MM新做了个发型怎么?#8221;q种问题Q自qBRIDGEl合一下不p?桥梁模式Q将抽象化与实现化脱耦,使得二者可以独立的变化Q也是说将他们之间的强兌变成弱关联,也就是指在一个Y件系l的抽象化和实现化之间用组?聚合关系而不是承关p,从而两者可以独立的变化?

8、COMPOSITE?Mary今天q生日?#8220;我过生日Q你要送我一件礼物?#8221;“嗯,好吧Q去商店Q你自己挑?#8221;“qgT恤挺漂亮Q买Q这条裙子好看,乎ͼq个包也不错Q买?#8221;“喂,C三g了呀Q我只答应送一件礼物的哦?#8221;“什么呀QT恤加裙子加包包,正好配成一套呀Q小姐,ȝ你包h?#8221;“……”QMM都会用Composite模式了,你会了没有? 合成模式Q合成模式将对象l织到树l构中,可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树l构表示出来。合成模式得客L把一个个单独的成分对象和׃们复合而成的合成对象同{看待?

9、DECORATOR?Maryq完轮到Sarlyq生日,q是不要叫她自己挑了Q不然这个月伙食费肯定玩完,拿出我去q在华山上照的照片Q在背面写上“最好的的礼物,是׃的Fita”Q再到街上礼品店C个像框(卖礼品的MM也很漂亮哦)Q再N壁搞术设计的Mike设计了一个漂亮的盒子装v?#8230;…Q我们都是DecoratorQ最l都在修饰我q个人呀Q怎么P看懂了吗Q?装饰模式Q装饰模式以对客L透明的方式扩展对象的功能Q是l承关系的一个替代方案,提供比承更多的灉|性。动态给一个对象增加功能,q些功能可以再动态的撤消。增加由一些基本功能的排列l合而生的非常大量的功能?

10、FACADE?我有一个专业的Nikon相机Q我喜Ƣ自己手动调光圈、快门,q样照出来的照片才专业,但MM可不懂这些,教了半天也不会。幸好相机有Facade设计模式Q把相机调整到自动Q只要对准目标按快门p了,一切由相机自动调整Q这样MM也可以用q个相机l我拍张照片了?门面模式Q外部与一个子pȝ的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系l更易于使用。每一个子pȝ只有一个门面类Q而且此门面类只有一个实例,也就是说它是一个单例模式。但整个pȝ可以有多个门面类?

11、FLYWEIGHT?每天跟MM发短信,手指都篏MQ最q买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上MM的名字就可以发送了Q再不用一个字一个字敲了。共享的句子是FlyweightQMM的名字就是提取出来的外部特征Q根据上下文情况使用?享元模式QFLYWEIGHT在拳L赛中指最轻量U。n元模式以׃n的方式高效的支持大量的细_度对象。n元模式能做到׃n的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部Q不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能媄响内蕴状态,它们是相互独立的。将可以׃n的状态和不可以共享的状态从常规cM区分开来,不可以׃n的状态从c里剔除出去。客L不可以直接创׃n的对象,而应当用一个工厂对象负责创׃n的对象。n元模式大q度的降低内存中对象的数量?

12、PROXY?跟MM在网上聊天,一开头L“hi,你好”,“你从哪儿来呀Q?#8221;“你多大了Q?#8221;“w高多少呀Q?#8221;q些话,真烦人,写个E序做ؓ我的Proxy吧,凡是接收到这些话都设|好了自q回答Q接收到其他的话时再通知我回{,怎么P酷吧?代理模式Q代理模式给某一个对象提供一个代理对象,q由代理对象控制Ҏ对象的引用。代理就是一个h或一个机构代表另一个h或者一个机构采取行动。某些情况下Q客户不x者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客L分L不出代理主题对象与真实主题对象。代理模式可以ƈ不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,q时候代理对象不能够创徏被代理对象,被代理对象必Lpȝ的其他角色代为创建ƈ传入?[b:9ceca65206]行ؓ模式[/b:9ceca65206]

13、CHAIN OF RESPONSIBLEITY?晚上Mp课,Z好开溜坐C最后一排,哇,前面坐了好几个漂亮的MM哎,扑ּU条Q写?#8220;Hi,可以做我的女朋友吗?如果不愿意请向前?#8221;Q纸条就一个接一个的传上MQ糟p,传到W一排的MM把纸条传l老师了,听说是个老处奛_Q快? 责Q链模式:在责任链模式中,很多对象由每一个对象对其下家的引用而接 h形成一条链。请求在q个链上传递,直到链上的某一个对象决定处理此h。客户ƈ不知道链上的哪一个对象最l处理这个请求,pȝ可以在不影响客户端的情况下动态的重新l织铑֒分配责Q。处理者有两个选择Q承担责L者把责Q推给下家。一个请求可以最l不被Q何接收端对象所接受?

14、COMMAND?俺有一个MM安得特别严,没法见面Q只好借助于她弟弟在我们俩之间传送信息,她对我有什么指C,写一张纸条让她弟弟带l我。这不,她弟弟又传送过来一个COMMANDQؓ了感谢他Q我请他吃了杂酱面Q哪知道他说Q?#8220;我同时给我姐姐三个男朋友送COMMANDQ就C最气Q才h吃面?#8221;Q?命o模式Q命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命o的责d执行命o的责d割开Q委z不同的对象。命令模式允许请求的一方和发送的一方独立开来,使得h的一方不必知道接收请求的一方的接口Q更不必知道h是怎么被接Ӟ以及操作是否执行Q何时被执行以及是怎么被执行的。系l支持命令的撤消?

15、INTERPRETER?俺有一个《MM真经》,上面有各UMM的攻略,比如说去吃西的步骤、去看电qҎ{等Q跟MMU会Ӟ只要做一个InterpreterQ照着上面的脚本执行就可以了?解释器模式:l定一个语a后,解释器模式可以定义出其文法的一U表C,q同时提供一个解释器。客L可以使用q个解释器来解释q个语言中的句子。解释器模式描q怎样在有了一个简单的文法后,使用模式设计解释q些语句。在解释器模式里面提到的语言是指M解释器对象能够解释的Ml合。在解释器模式中需要定义一个代表文法的命ocȝ{l构Q也是一pd的组合规则。每一个命令对象都有一个解释方法,代表对命令对象的解释。命令对象的{l构中的对象的Q何排列组合都是一个语a?

16、ITERATOR?我爱上了MaryQ不一切的向她求婚?MaryQ?#8220;惌我跟你结婚,得答应我的条?#8221; 我:“什么条件我都答应,你说?#8221; MaryQ?#8220;我看上了那个一克拉的钻?#8221; 我:“我买Q我乎ͼq有吗?” MaryQ?#8220;我看上了湖边的那栋别?#8221; 我:“我买Q我乎ͼq有吗?” MaryQ?#8220;我看上那辆法拉利跑R” 我脑袋嗡的一壎ͼ坐在椅子上,一咬牙Q?#8220;我买Q我乎ͼq有吗?” …… q代子模式:q代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起Ş成的MUC集,聚集对象是能够包容一l对象的容器对象。P代子模式P代逻辑装C个独立的子对象中Q从而与聚集本n隔开。P代子模式化了聚集的界面。每一个聚集对象都可以有一个或一个以上的q代子对象,每一个P代子的P代状态可以是彼此独立的。P代算法可以独立于聚集角色变化?

17、MEDIATOR?四个MM打麻,怺之间谁应该给谁多钱不清楚了,q怺当时我在旁边Q按照各自的{码数算钱,赚了q从我q里拿,赔了q也付l我Q一切就OK啦,俺得C四个MM的电话?调停者模式:调停者模式包装了一pd对象怺作用的方式,使得q些对象不必怺明显作用。从而他们可以松散偶合。当某些对象之间的作用发生改变时Q不会立卛_响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的怺作用转化Z对多的相互作用。调停者模式将对象的行为和协作抽象化,把对象在尺度的行ؓ上与其他对象的相互作用分开处理?

18、MEMENTO?同时跟几个MM聊天Ӟ一定要记清楚刚才跟MM说了些什么话Q不然MM发现了会不高兴的哦,q怺我有个备忘录Q刚才与哪个MM说了什么话我都拯一份放到备忘录里面保存Q这样可以随时察看以前的记录啦?备忘录模式:备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏装的条件下Q将一个对象的状态捉住,q外部化Q存储v来,从而可以在来合适的时候把q个对象q原到存储v来的状态?

19、OBSERVER?想知道咱们公司最新MM情报吗?加入公司的MM情报邮gl就行了Qtom负责搜集情报Q他发现的新情报不用一个一个通知我们Q直接发布给邮gl,我们作ؓ订阅者(观察者)可以及时收到情报啦 观察者模式:观察者模式定义了一U一队多的依赖关p,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化Ӟ会通知所有观察者对象,使他们能够自动更新自己?

20、STATE?跟MM交往Ӟ一定要注意她的状态哦Q在不同的状态时她的行ؓ会有不同Q比如你U她今天晚上ȝ电媄Q对你没兴趣的MM׃?#8220;有事情啦”Q对你不讨厌但还没喜Ƣ上的MM׃?#8220;好啊Q不q可以带上我同事么?”Q已l喜Ƣ上你的MM׃?#8220;几点钟?看完电媄再去泡吧怎么P”Q当然你看电pE中表现良好的话Q也可以把MM的状态从不讨厌不喜欢变成喜欢哦?状态模式:状态模式允怸个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一栗状态模式把所研究的对象的行ؓ包装在不同的状态对象里Q每一个状态对象都属于一个抽象状态类的一个子cR状态模式的意图是让一个对象在其内部状态改变的时候,其行Z随之改变。状态模式需要对每一个系l可能取得的状态创立一个状态类的子cR当pȝ的状态变化时Q系l便改变所选的子类?

21、STRATEGY?跟不同类型的MMU会Q要用不同的{略Q有的请电媄比较好,有的则去吃小吃效果不错,有的LvҎ漫最合适,单目的都是ؓ了得到MM的芳心,我的qMM锦囊中有好多Strategy哦?{略模式Q策略模式针对一l算法,每一个算法封装到h共同接口的独立的cMQ从而得它们可以相互替换。策略模式得算法可以在不媄响到客户端的情况下发生变化。策略模把行为和环境分开。环境类负责l持和查询行为类Q各U算法在具体的策略类中提供。由于算法和环境独立开来,法的增减,修改都不会媄响到环境和客L?

22、TEMPLATE METHOD??看过《如何说服女生上床》这部经典文章吗Q女生从认识C床的不变的步骤分为y遇、打破僵局、展开q求、接吅R前戏、动手、爱抚、进d大步?Template method)Q但每个步骤针对不同的情况,都有不一L做法Q这p看你随机应变?具体实现)Q?模板Ҏ模式Q模板方法模式准备一个抽象类Q将部分逻辑以具体方法以及具体构造子的Ş式实玎ͼ然后声明一些抽象方法来q子类实现剩余的逻辑。不同的子类可以以不同的方式实现q些抽象ҎQ从而对剩余的逻辑有不同的实现。先制定一个顶U逻辑框架Q而将逻辑的细节留l具体的子类d现?

23、VISITOR?情h节到了,要给每个MM送一束鲜花和一张卡片,可是每个MM送的花都要针对她个h的特点,每张卡片也要Ҏ个h的特Ҏ挑,我一个h哪搞得清楚,q是找花店老板和礼品店老板做一下VisitorQ让花店老板ҎMM的特炚w一束花Q让C品店老板也根据每个h特点选一张卡Q这样就L多了Q?讉K者模式:讉K者模式的目的是封装一些施加于某种数据l构元素之上的操作。一旦这些操作需要修改的话,接受q个操作的数据结构可以保持不变。访问者模式适用于数据结构相Ҏ定的pȝQ它把数据结构和作用于结构上的操作之间的耦合解脱开Q得操作集合可以相对自q演化。访问者模式得增加新的操作变的很ҎQ就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中Q而不是分散到一个个的节点类中。当使用讉K者模式时Q要尽可能多的对象览逻辑攑֜讉K者类中,而不是放到它的子cM。访问者模式可以跨q几个类的等U结构访问属于不同的{l构的成员类?/a>


]]>
prototype设计模式http://www.aygfsteel.com/baoyaer/articles/111827.html大田?/dc:creator>大田?/author>Thu, 19 Apr 2007 01:12:00 GMThttp://www.aygfsteel.com/baoyaer/articles/111827.htmlhttp://www.aygfsteel.com/baoyaer/comments/111827.htmlhttp://www.aygfsteel.com/baoyaer/articles/111827.html#Feedback0http://www.aygfsteel.com/baoyaer/comments/commentRss/111827.htmlhttp://www.aygfsteel.com/baoyaer/services/trackbacks/111827.html原型模式定义:
用原型实例指定创建对象的U类,q且通过拯q些原型创徏新的对象.

Prototype模式允许一个对象再创徏另外一个可定制的对象,Ҏ无需知道M如何创徏的细?工作原理?通过一个原型对象传l那个要发动创徏的对象,q个要发动创建的对象通过h原型对象拯它们自己来实施创建?/p>

如何使用?
因ؓJava中的提供clone()Ҏ来实现对象的克隆,所以Prototype模式实现一下子变得很简?

以勺子ؓ例:

public abstract class AbstractSpoon implements Cloneable
{
  String spoonName;

  public void setSpoonName(String spoonName) {this.spoonName = spoonName;}
  public String getSpoonName() {return this.spoonName;}

  public Object clone()
  {
    Object object = null;
    try {
      object = super.clone();
    } catch (CloneNotSupportedException exception) {
      System.err.println("AbstractSpoon is not Cloneable");
    }
    return object;
  }
}

有个具体实现(ConcretePrototype):

public class SoupSpoon extends AbstractSpoon
{
  public SoupSpoon()
  {
    setSpoonName("Soup Spoon");
  }
}

 

调用Prototype模式很简?

AbstractSpoon spoon = new SoupSpoon();
AbstractSpoon spoon2 = spoon.clone();

当然也可以结合工厂模式来创徏AbstractSpoon实例?/p>

在Java中Prototype模式变成clone()Ҏ的用,׃Java的纯z的面向对象Ҏ,使得在Java中用设计模式变得很自然Q两者已l几乎是然一体了。这反映在很多模式上Q如Interator遍历模式?/p>

]]>
设计模式之Decorator(Ҏ?http://www.aygfsteel.com/baoyaer/articles/90032.html大田?/dc:creator>大田?/author>Tue, 26 Dec 2006 01:45:00 GMThttp://www.aygfsteel.com/baoyaer/articles/90032.htmlhttp://www.aygfsteel.com/baoyaer/comments/90032.htmlhttp://www.aygfsteel.com/baoyaer/articles/90032.html#Feedback0http://www.aygfsteel.com/baoyaer/comments/commentRss/90032.htmlhttp://www.aygfsteel.com/baoyaer/services/trackbacks/90032.html阅读全文

]]>
设计模式之Adapter(适配?http://www.aygfsteel.com/baoyaer/articles/89452.html大田?/dc:creator>大田?/author>Fri, 22 Dec 2006 02:44:00 GMThttp://www.aygfsteel.com/baoyaer/articles/89452.htmlhttp://www.aygfsteel.com/baoyaer/comments/89452.htmlhttp://www.aygfsteel.com/baoyaer/articles/89452.html#Feedback0http://www.aygfsteel.com/baoyaer/comments/commentRss/89452.htmlhttp://www.aygfsteel.com/baoyaer/services/trackbacks/89452.html 定义:
两个不兼容的类U合在一起用,属于l构型模?需要有Adaptee(被适配?和Adaptor(适配?两个w䆾.

Z使用?
我们l常到要将两个没有关系的类l合在一起?W一解决Ҏ是:修改各自cȝ接口Q但是如果我们没有源代码Q或者,我们不愿意ؓ了一个应用而修改各自的接口?怎么?

使用AdapterQ在q两U接口之间创Z个؜合接?淯?.

如何使用?
实现Adapter方式,其实"think in Java"?cd?一节中已经提到,有两U方式:l合(composition)和?inheritance).


假设我们要打桩,有两U类Q方形桩 圆Ş?

public   class  SquarePeg {
  
public   void  insert(String str) {
    System.out.println(
" SquarePeg insert(): " + str);
  }


}


public   class  RoundPeg {
  
public   void  insertIntohole(String msg) {
    System.out.println(
" RoundPeg insertIntoHole(): " + msg);
}

}


现在有一个应?span lang="EN-US">,需要既打方形桩,又打圆Ş?那么我们需要将q两个没有关pȝcȝ合应?假设RoundPeg我们没有源代?或源代码我们不想修改,那么我们使用Adapter来实现这个应?

public   class  PegAdapter  extends  SquarePeg {

  
private  RoundPeg roundPeg;

  
public  PegAdapter(RoundPeg peg)( this .roundPeg = peg;)

  
public   void  insert(String str) { roundPeg.insertIntoHole(str);}

}


在上面代码中,RoundPeg属于Adaptee,是被适配?PegAdapter是Adapter,Adaptee(被适配者RoundPeg)和Target(目标SquarePeg)q行适配.实际上这是将l合Ҏ(composition)和?inheritance)Ҏl合q用.

PegAdapter首先l承SquarePegQ然后用new的组合生成对象方式,生成RoundPeg的对象roundPegQ再重蝲父类insert()Ҏ。从q里,你也了解使用new生成对象和用extendsl承生成对象的不?前者无需对原来的cM?甚至无需要知道其内部l构和源代码.

如果你有?span lang="EN-US">Java使用的经验,已经发现Q这U模式经怋用?/span>

q一步?/b>
上面的PegAdapter是承了SquarePeg,如果我们需要两边承,即承SquarePeg 又承RoundPeg,因ؓJava中不允许多承,但是我们可以实现(implements)两个接口(interface)

public   interface  IRoundPeg {
  
public   void  insertIntoHole(String msg);

}
 

public   interface  ISquarePeg {
  
public   void  insert(String str); 

}
 

下面是新?span lang="EN-US">RoundPeg 和SquarePeg, 除了实现接口q一区别Q和上面的没什么区别?br />

public   class  SquarePeg  implements  ISquarePeg {
  
public   void  insert(String str) {
    System.out.println(
" SquarePeg insert(): " + str);
  }


}
 

public   class  RoundPeg  implements  IRoundPeg {
  
public   void  insertIntohole(String msg) {
    System.out.println(
" RoundPeg insertIntoHole(): " + msg);
  }

}
 

下面是新?span lang="EN-US">PegAdapter,叫做two-way adapter:

public   class  PegAdapter  implements  IRoundPeg,ISquarePeg {

  
private  RoundPeg roundPeg;
  
private  SquarePeg squarePeg;

  
//  构造方?/span>
   public  PegAdapter(RoundPeg peg) { this .roundPeg = peg;}
  
//  构造方?/span>
   public  PegAdapter(SquarePeg peg)( this .squarePeg = peg;) 

  
public   void  insert(String str) { roundPeg.insertIntoHole(str);}

}
 

q有一U叫Pluggable Adapters,可以动态的获取几个adapters中一个。用Reflection技术,可以动态的发现cM的PublicҎ?/span>



]]>
java模式之Reactorhttp://www.aygfsteel.com/baoyaer/articles/87514.html大田?/dc:creator>大田?/author>Wed, 13 Dec 2006 08:15:00 GMThttp://www.aygfsteel.com/baoyaer/articles/87514.htmlhttp://www.aygfsteel.com/baoyaer/comments/87514.htmlhttp://www.aygfsteel.com/baoyaer/articles/87514.html#Feedback0http://www.aygfsteel.com/baoyaer/comments/commentRss/87514.htmlhttp://www.aygfsteel.com/baoyaer/services/trackbacks/87514.htmlJava NIO非堵塞应用通常适用用在I/Od{方面,我们知道Q系l运行的性能瓉通常在I/OdQ包括对端口和文件的操作上,q去Q在打开一个I/O通道后,read()一直等待在端口一边读取字节内容,如果没有内容q来Qread()也是d的等Q这会媄响我们程序l做其他事情Q那么改q做法就是开讄E,让线E去{待Q但是这样做也是相当耗费资源的?/p>

Java NIO非堵塞技术实际是采取Reactor模式Q或者说是Observer模式为我们监察I/O端口Q如果有内容q来Q会自动通知我们Q这P我们׃必开启多个线E死{,从外界看Q实C畅的I/OdQ不堵塞了?/p>

Java NIO出现不只是一个技术性能的提高,你会发现|络上到处在介绍它,因ؓ它具有里E碑意义Q从JDK1.4开始,Java开始提高性能相关的功能,从而得Java在底层或者ƈ行分布式计算{操作上已经可以和C或Perl{语aq齐驱?/p>

如果你至今还是在怀疑Java的性能Q说明你的思想和观念已l完全落伍了QJava一两年应该用新的名词来定义。从JDK1.5开始又要提供关于线E、ƈ发等新性能的支持,Java应用在游戏等适时领域斚w的机会已l成熟,Java在稳定自׃间gC后,开始蚕食传lC的领域?/p>

本文主要单介lNIO的基本原理,在下一文章中Q将l合Reactor模式和著名线E大?a >Doug Lea的一文章深入讨论?/p>

NIO主要原理和适用?/p>

NIO 有一个主要的cSelector,q个cM一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有事g发生Ӟ他会通知我们Q传回一lSelectionKey,我们dq些Key,׃获得我们刚刚注册q的socketchannel,然后Q我们从q个Channel中读取数据,攑ֿQ包准能够读刎ͼ接着我们可以处理q些数据?/p>

Selector内部原理实际是在做一个对所注册的channel的轮询访问,不断的轮?目前p一个算?Q一旦轮询到一个channel有所注册的事情发生,比如数据来了Q他׃站v来报告,交出一把钥匙,让我们通过q把钥匙来读取这个channel的内宏V?/p>

了解了这个基本原理,我们l合代码看看使用Q在使用上,也在分两个方向,一个是U程处理Q一个是用非U程Q后者比较简单,看下面代码:


import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.channels.spi.*;
import java.net.*;
import java.util.*;

/**
*
* @author Administrator
* @version
*/
public class NBTest {


  /** Creates new NBTest */
  public NBTest()
  {
  }

  public void startServer() throws Exception
  {
  int channels = 0;
  int nKeys = 0;
  int currentSelector = 0;

  //使用Selector
  Selector selector = Selector.open();

  //建立Channel q绑定到9000端口
  ServerSocketChannel ssc = ServerSocketChannel.open();
  InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(),9000);
  ssc.socket().bind(address);

  //使设定non-blocking的方式?br />  ssc.configureBlocking(false);

  //向Selector注册Channel及我们有兴趣的事?br />  SelectionKey s = ssc.register(selector, SelectionKey.OP_ACCEPT);
  printKeyInfo(s);

  while(true) //不断的轮?br />  {
    debug("NBTest: Starting select");

    //Selector通过selectҎ通知我们我们感兴的事g发生了?br />    nKeys = selector.select();
    //如果有我们注册的事情发生了,它的传回值就会大?
    if(nKeys > 0)
    {
      debug("NBTest: Number of keys after select operation: " +nKeys);

      //Selector传回一lSelectionKeys
      //我们从这些key中的channel()Ҏ中取得我们刚刚注册的channel?br />      Set selectedKeys = selector.selectedKeys();
      Iterator i = selectedKeys.iterator();
      while(i.hasNext())
      {
         s = (SelectionKey) i.next();
         printKeyInfo(s);
         debug("NBTest: Nr Keys in selector: " +selector.keys().size());

         //一个key被处理完成后Q就都被从就l关键字Qready keysQ列表中除去
         i.remove();
         if(s.isAcceptable())
         {
           // 从channel()中取得我们刚刚注册的channel?br />           Socket socket = ((ServerSocketChannel)s.channel()).accept().socket();
           SocketChannel sc = socket.getChannel();

           sc.configureBlocking(false);
           sc.register(selector, SelectionKey.OP_READ |SelectionKey.OP_WRITE);
                      System.out.println(++channels);
         }
         else
         {
           debug("NBTest: Channel not acceptable");
         }
      }
   }
   else
   {
      debug("NBTest: Select finished without any keys.");
   }

  }

}


private static void debug(String s)
{
  System.out.println(s);
}


private static void printKeyInfo(SelectionKey sk)
{
  String s = new String();

  s = "Att: " + (sk.attachment() == null ? "no" : "yes");
  s += ", Read: " + sk.isReadable();
  s += ", Acpt: " + sk.isAcceptable();
  s += ", Cnct: " + sk.isConnectable();
  s += ", Wrt: " + sk.isWritable();
  s += ", Valid: " + sk.isValid();
  s += ", Ops: " + sk.interestOps();
  debug(s);
}


/**
* @param args the command line arguments
*/
public static void main (String args[])
{
  NBTest nbTest = new NBTest();
  try
  {
    nbTest.startServer();
  }
    catch(Exception e)
  {
    e.printStackTrace();
  }
}

}


q是一个守候在端口9000的noblock server例子Q如果我们编制一个客LE序Q就可以对它q行互动操作Q或者用telnet L名 90000 可以链接上?/p>

当前分布式计 Web Services盛行天下Q这些网l服务的底层都离不开对socket的操作。他们都有一个共同的l构Q?br />1. Read request
2. Decode request
3. Process service
4. Encode reply
5. Send reply

l典的网l服务的设计如下图,在每个线E中完成Ҏ据的处理Q?br />

但这U模式在用户负蝲增加Ӟ性能下降非常的快。我们需要重新寻找一个新的方案,保持数据处理的流畅,很显Ӟ事g触发机制是最好的解决办法Q当有事件发生时Q会触动handler,然后开始数据的处理?/p>

Reactor模式cM于AWT中的Event处理Q?br />

Reactor模式参与?/strong>

1.Reactor 负责响应IO事gQ一旦发生,q播发送给相应的Handlerd?q类gAWT的thread
2.Handler 是负责非堵塞行ؓQ类gAWT ActionListenersQ同时负责将handlers与event事gl定Q类gAWT addActionListener

如图Q?br />

Java的NIO为reactor模式提供了实现的基础机制Q它的Selector当发现某个channel有数据时Q会通过SlectorKey来告知我们,在此我们实现事g和handler的绑定?/p>

我们来看看Reactor模式代码:


public class Reactor implements Runnable{

  final Selector selector;
  final ServerSocketChannel serverSocket;

  Reactor(int port) throws IOException {
    selector = Selector.open();
    serverSocket = ServerSocketChannel.open();
    InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(),port);
    serverSocket.socket().bind(address);

    serverSocket.configureBlocking(false);
    //向selector注册该channel
     SelectionKey sk =serverSocket.register(selector,SelectionKey.OP_ACCEPT);

    logger.debug("-->Start serverSocket.register!");

    //利用sk的attache功能l定Acceptor 如果有事情,触发Acceptor
    sk.attach(new Acceptor());
    logger.debug("-->attach(new Acceptor()!");
  }


  public void run() { // normally in a new Thread
    try {
    while (!Thread.interrupted())
    {
      selector.select();
      Set selected = selector.selectedKeys();
      Iterator it = selected.iterator();
      //Selector如果发现channel有OP_ACCEPT或READ事g发生Q下列遍历就会进行?br />      while (it.hasNext())
        //来一个事?W一ơ触发一个accepterU程
        //以后触发SocketReadHandler
        dispatch((SelectionKey)(it.next()));
        selected.clear();
      }
    }catch (IOException ex) {
        logger.debug("reactor stop!"+ex);
    }
  }

  //q行Acceptor或SocketReadHandler
  void dispatch(SelectionKey k) {
    Runnable r = (Runnable)(k.attachment());
    if (r != null){
      // r.run();

    }
  }

  class Acceptor implements Runnable { // inner
    public void run() {
    try {
      logger.debug("-->ready for accept!");
      SocketChannel c = serverSocket.accept();
      if (c != null)
        //调用Handler来处理channel
        new SocketReadHandler(selector, c);
      }
    catch(IOException ex) {
      logger.debug("accept stop!"+ex);
    }
    }
  }
}

以上代码中y妙用了SocketChannel的attach功能Q将Hanlder和可能会发生事g的channel链接在一P当发生事件时Q可以立卌发相应链接的Handler?/p>

再看看Handler代码:

public class SocketReadHandler implements Runnable {

  public static Logger logger = Logger.getLogger(SocketReadHandler.class);

  private Test test=new Test();

  final SocketChannel socket;
  final SelectionKey sk;

   static final int READING = 0, SENDING = 1;
  int state = READING;

  public SocketReadHandler(Selector sel, SocketChannel c)
    throws IOException {

    socket = c;

    socket.configureBlocking(false);
     sk = socket.register(sel, 0);

    //SelectionKeyl定为本Handler 下一步有事g触发Ӟ调用本cȝrunҎ?br />    //参看dispatch(SelectionKey k)
    sk.attach(this);

    //同时SelectionKey标记为可读,以便d?br />    sk.interestOps(SelectionKey.OP_READ);
    sel.wakeup();
  }

  public void run() {
    try{
    // test.read(socket,input);
      readRequest() ;
    }catch(Exception ex){
    logger.debug("readRequest error"+ex);
    }
  }


/**
* 处理ddata
* @param key
* @throws Exception
*/
private void readRequest() throws Exception {

  ByteBuffer input = ByteBuffer.allocate(1024);
  input.clear();
  try{

    int bytesRead = socket.read(input);

    ......

    //ȀzȝE池 处理q些request
    requestHandle(new Request(socket,btt));

    .....


  }catch(Exception e) {
  }

}

注意在Handler里面又执行了一ơattachQ这P覆盖前面的AcceptorQ下ơ该Handler又有READ事g发生Ӟ直接触发Handler.从而开始了数据的读 处理 写 发出{流E处理?/p>

数据读出后Q可以将q些数据处理U程做成一个线E池Q这P数据d后,立即扔到U程池中Q这样加速处理速度Q?/p>

更进一步,我们可以使用多个Selector分别处理q接和读事g?/p>

一个高性能的Java|络服务机制p形成Q激动h心的集群q行计算卛_实现?/p>

Scalable IO in Java原文

 



]]>
设计模式之Observerhttp://www.aygfsteel.com/baoyaer/articles/86361.html大田?/dc:creator>大田?/author>Fri, 08 Dec 2006 07:32:00 GMThttp://www.aygfsteel.com/baoyaer/articles/86361.html

以上是API手册里观察者的UML图,Q本文主要讨己实现观察者模式,JDK内置的就自己癑ֺ下吧Q从上图中我们可以看Z共需要两个接口,两个具体的实现类Q分别是观察者接口,观察者实现类Q被观察者接口,被观察者实现类Qƈ且被观察者中会有多个观察者,因此我们惛_的是用一个集合框架来储存观察者(例如ListQ,也就是用组合啦?br />
下面的东襉K过具体代码来解析给大家听?br /> 场景是有一条变色龙Q然后有一堆h在猥琐地注视着它(好可怜哇。。。)Q当变色龙变色的时候,所有h要将新的颜色记录下来?br />
首先是观察者接?

package org.black.observer;
public interface Observer {
 
public void update(Object observable);
}
代码很简单,updateҎ做的是当变色龙变色的时候调用的ҎQƈ且因知道变色龙的颜色Q所以需要传递一个参敎ͼ读者会问,那直接传递String color可以了哇,写成对象的目的是Z防止需求的改变Q万一以后变色龙有没有吐舌头都要你记录的时候,你就可以不需要在此方法多加参C?br />
接下来是观察者的实现cR?
package org.black.observer;
import org.black.observable.Bsl;

public class Person implements Observer {

    
private String name;

    
public Person(String name){
    
this.name = name;
    }


    
public void update(Object observable) {
    Bsl bsl 
= (Bsl)observable;
    System.out.println(name
+"记录了变色龙的颜色ؓ:"+bsl.getColor());
    }


}


q里代码不做多解析,{的那个地方也是ؓ了应变需求改变,万一以后不仅仅要记录变色龙,q要记录鹦鹉什么的Q那接口的代码也׃需要改变了?br />
然后是被观察者接?/span>

package org.black.observable;
import org.black.observer.Observer;

public interface Observable {

    
public void addObserver(Observer observer);

    
public void removeObserver(Observer observer);

    
public void notifyAllObserver();
}

 

q里前两个方法ؓ的就是添加观察者和除去观察者呗Q通知Ҏ是当状态改变的时候,要告知所有的观察者,q里可能有点懵,看了实现cd很容易懂了?br />
下面是被观察者实现类

 

package org.black.observable;
import java.util.ArrayList;
import java.util.List;
import org.black.observer.Observer;
public class Bsl implements Observable {

private String color = "l色";
private List<Observer> observerList = new ArrayList<Observer>();

public void addObserver(Observer observer) {
observerList.add(observer);
}

public void removeObserver(Observer observer) {
observerList.remove(observer);
}


public void notifyAllObserver() {
for(Observer observer : observerList){
   observer.update(
this);
}

   
}

public void changeColor(String color){
this.color = color;
System.out.println(
"变色龙将颜色变ؓQ?/span>"+color);
notifyAllObserver();
}


public String getColor() {
return color;
}

public void setColor(String color) {
this.color = color;
}

}


在这里,color是被观察者的状态啦Q当q个状态改变的时候就必须告诉所有的观察者,所以changeColor里面需要调用notifyAllObserver
下面是主函数

package org.black.test;
import org.black.observable.Bsl;
import org.black.observer.Observer;
import org.black.observer.Person;
public class TestObserver {
/**
@param args
*/

public static void main(String[] args) {
Bsl bsl 
= new Bsl();

Observer p1 
= new Person("hjq");
Observer p2 
= new Person("zz");

bsl.addObserver(p1);

bsl.addObserver(p2);

bsl.changeColor(
"黄色");

bsl.removeObserver(p2);

bsl.addObserver(
new Observer(){
   
public void update(Object observable) {
    Bsl bsl 
= (Bsl)observable;
    System.out.println(
"无名氏记录了变色龙的颜色?"+bsl.getColor());
   }

   
}
);

bsl.changeColor(
"U色");

}

}

 

匿名cȝ写法怿大家一定非常熟悉了Q很像SWING里面的addListenerQ很方便Q遗憄是,不能知道名字Q也没办法remove了?br />
l果?


变色龙将颜色变ؓQ黄?br /> hjq记录了变色龙的颜色ؓ:黄色
zz记录了变色龙的颜色ؓ:黄色
变色龙将颜色变ؓQ红?br /> hjq记录了变色龙的颜色ؓ:U色
无名氏记录了变色龙的颜色?U色

大家多多支持。。以后会推出更多?span class="t_tag" onxxxxx="tagshow(event)" href="tag.php?name=%C9%E8%BC%C6%C4%A3%CA%BD">设计模式的代码,力求单生动,易于理解。?br />


 



]]>
Java IOC设计模式http://www.aygfsteel.com/baoyaer/articles/86337.html大田?/dc:creator>大田?/author>Fri, 08 Dec 2006 06:31:00 GMThttp://www.aygfsteel.com/baoyaer/articles/86337.htmlhttp://www.aygfsteel.com/baoyaer/comments/86337.htmlhttp://www.aygfsteel.com/baoyaer/articles/86337.html#Feedback0http://www.aygfsteel.com/baoyaer/comments/commentRss/86337.htmlhttp://www.aygfsteel.com/baoyaer/services/trackbacks/86337.html IoC模式?

   IoCQInversion of ControlQ模式ƈ不是什么新的东西,它是一U很普遍的概念,依赖注入QDependency InjectionQ是Martin Flower对IoC模式的一U扩展的解释[2]。IoC是一U用来解决组Ӟ实际上也可以是简单的Javac)之间依赖关系、配|及生命周期的设计模式,其中对组件依赖关pȝ处理是IoC的精华部分。IoC的实际意义就是把lg之间的依赖关pL取(反{Q出来,由容器来具体配置。这P各个lg之间׃存在hard-code的关联,Mlg都可以最大程度的得到重用。运用了IoC模式后我们不再需要自q理组件之间的依赖关系Q只需要声明由容器d现这U依赖关pR就好像把对lg之间依赖关系的控制进行了倒置Q不再由lg自己来徏立这U依赖关p而交l容器(例如我们后面会介l的PicoContainer、SpringQ去理?

   我们从一个简单的例子看vQ考虑一个Button控制Lamp的例子: 

public class Button 

   
private Lamp lamp; 

   
public void push() 

       lamp.turnOn(); 

   }
 

}
 

   但是马上发现q个设计的问题,Buttoncȝ接依赖于Lampc,q个依赖关系意味着当LampcMҎQButtoncM受到影响。此外,想重用ButtoncL控制cM与Lamp的(比如同样hturnOn功能的ComputerQ另外一个对象则是不可能的。即Button控制LampQƈ且只能控制Lamp。显然违反了“高层模块不应该依赖于低层模块,两者都应该依赖于抽象;抽象不应该依赖于具体实现Q细节应该依赖于抽象?q一原则QDIP原则Q。考虑Cq问题,自然的想到应该抽象出一个接口SwitchableDeviceQ来消除Button对Lamp的依赖,于是设计如下Q?

public class Button 

   
private SwitchableDevice lamp; 

   
public Button()

   lamp
= new Lamp(); 

   }
 

}
 






]]>
java代理模式 (? http://www.aygfsteel.com/baoyaer/articles/84080.html大田?/dc:creator>大田?/author>Tue, 28 Nov 2006 08:11:00 GMThttp://www.aygfsteel.com/baoyaer/articles/84080.htmlhttp://www.aygfsteel.com/baoyaer/comments/84080.htmlhttp://www.aygfsteel.com/baoyaer/articles/84080.html#Feedback0http://www.aygfsteel.com/baoyaer/comments/commentRss/84080.htmlhttp://www.aygfsteel.com/baoyaer/services/trackbacks/84080.html1. 代理模式
代理模式的作用是Qؓ其他对象提供一U代理以控制对这个对象的讉K。在某些情况下,一个客户不x者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用?
代理模式一般涉及到三个角色Q?
抽象角色Q声明真实对象和代理对象的共同接口;
代理角色Q代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在Q何时刻都能代替真实对象。同Ӟ代理对象可以在执行真实对象操作时Q附加其他的操作Q相当于对真实对象进行封装?
真实角色Q代理角色所代表的真实对象,是我们最l要引用的对象?/p>

以下以《Java与模式》中的示例ؓ例:

抽象角色Q?

abstract   public   class  Subject  {
   
abstract   public   void  request(); 
}
  


真实角色Q实CSubject的request()Ҏ?

public   class  RealSubject  extends  Subject 
    
public  RealSubject()  { }  
    
    
public   void  request() 
        System.out.println(
" From real subject. " ); 
    }
 
}
 


代理角色Q?br />

public   class  ProxySubject  extends  Subject 
    
private  RealSubject realSubject;  // 以真实角色作Z理角色的属性?/span>

    
public  ProxySubject()  { }  


    
public   void  request()  // 该方法封装了真实对象的requestҎ 
        preRequest(); 

        
if ( realSubject  ==   null  ) 

            realSubject 
=   new  RealSubject(); 
        }
 

        realSubject.request(); 
// 此处执行真实对象的requestҎ 

        postRequest(); 
    }



  客户端调用:

Subject sub = new  ProxySubject(); 
Sub.request(); 

׃上代码可以看出,客户实际需要调用的是RealSubjectcȝrequest()ҎQ现在用ProxySubject来代?RealSubjectc,同样辑ֈ目的Q同时还装了其他方?preRequest(),postRequest())Q可以处理一些其他问题?

另外Q如果要按照上述的方法用代理模式,那么真实角色必须是事先已l存在的Qƈ其作ؓ代理对象的内部属性。但是实际用时Q一个真实角色必d应一?代理角色Q如果大量用会Dcȝ急剧膨胀Q此外,如果事先q不知道真实角色Q该如何使用代理呢?q个问题可以通过Java的动态代理类来解冟?br /> 
2.动态代理类

Java动态代理类位于Java.lang.reflect包下Q一般主要涉及到以下两个c:

(1). Interface InvocationHandlerQ该接口中仅定义了一个方法ObjectQinvoke(Object obj,Method method, Object[] args)。在实际使用ӞW一个参数obj一般是指代理类Qmethod是被代理的方法,如上例中的request()QargsҎ的参数数l?q个抽象Ҏ在代理类中动态实现?


(2).ProxyQ该cd为动态代理类Q作用类g上例中的ProxySubjectQ其中主要包含以下内容:

Protected Proxy(InvocationHandler h)Q构造函敎ͼ估计用于l内部的h赋倹{?

Static Class getProxyClass (ClassLoader loader, Class[] interfaces)Q获得一个代理类Q其中loader是类装蝲器,interfaces是真实类所拥有的全部接口的数组?

Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)Q返回代理类的一个实例,q回后的代理cd以当作被代理cM?可用被代理cȝ在Subject接口中声明过的方??

 

所谓Dynamic Proxy是这样一UclassQ它是在q行时生成的classQ在生成它时你必L供一linterfacel它Q然后该classU它实现了这?interface。你当然可以把该class的实例当作这些interface中的M一个来用。当然啦Q这个Dynamic Proxy其实是一个ProxyQ它不会替你作实质性的工作Q在生成它的实例时你必须提供一个handlerQ由它接实际的工作?/p>

在用动态代理类Ӟ我们必须实现InvocationHandler接口Q以W一节中的示例ؓ例:


抽象角色(之前是抽象类Q此处应改ؓ接口)Q?br />
public   interface  Subject 
   
abstract   public   void  request(); 
}
 



具体角色RealSubjectQ?br />
public   class  RealSubject  implements  Subject {

  
public  RealSubject() {}

  
public   void  request() {
    System.out.println(
" From real subject. " );
  }


}
 


代理处理器:

import  java.lang.reflect.Method;

import  java.lang.reflect.InvocationHandler;

public   class  DynamicSubject  implements  InvocationHandler  {
  
private  Object sub;
  
public  DynamicSubject()  {}

  
public  DynamicSubject(Object obj)  {
    sub 
=  obj;
  }


public  Object invoke(Object proxy, Method method, Object[] args)  throws  Throwable  {
   System.out.println(
" before calling  "   +  method);
   method.invoke(sub,args);

   System.out.println(
" after calling  "   +  method);
   
return   null ;
 }


}


 

该代理类的内部属性ؓObjectc,实际使用旉过该类的构造函数DynamicSubject(Object obj)对其赋|此外Q在该类q实CinvokeҎQ该Ҏ中的

method.invoke(sub,args);

其实是调用被代理对象的要被执行的ҎQ方法参数sub是实际的被代理对象,args为执行被代理对象相应操作所需的参数。通过动态代理类Q我们可以在调用之前或之后执行一些相x作?

客户端:

import  java.lang.reflect.InvocationHandler; 
import  java.lang.reflect.Proxy; 
import  java.lang.reflect.Constructor; 
import  java.lang.reflect.Method; 

public   class  Client 

static   public   void  main(String[] args)  throws  Throwable 

   RealSubject rs 
=   new  RealSubject();  // 在这里指定被代理c?/span>
   InvocationHandler ds  =   new  DynamicSubject(rs); 
   Class cls 
=  rs.getClass(); 

   
// 以下是一ơ性生成代?/span>
   Subject subject  =  (Subject) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(),ds ); 
   subject.request(); 

}
 

E序q行l果Q?br />before calling public abstract void Subject.request()
From real subject.
after calling public abstract void Subject.request()

通过q种方式Q被代理的对?RealSubject)可以在运行时动态改变,需要控制的接口(Subject接口)可以在运行时改变Q控制的方式(DynamicSubjectc?也可以动态改变,从而实C非常灉|的动态代理关pR?br />



]]>
վ֩ģ壺 ƽ| ϰ| | | | | | Դ| | | | ƺ| γ| ֶ| ̨ǰ| ˫| | ƽ| ɽ| | ĺ| | ³| ̫| | | | | | | | ˻| | | ξ| | ۰| ̶| | ԭ| |