﻿<?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-EIP&amp;MEP(Everything Is Possible &amp; Make Everything Possible)-文章分类-java设计模式(包括J2EE设置模式)</title><link>http://www.blogjava.net/lidh04/category/14573.html</link><description>I have many dreams, but I hardly realize one of these dreams, So I try to persuade myself to break my dreams, i wanna be my dream breaker!!!!Action, Action, Action, belive EIP and try to 
MEP!!!</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 07:46:06 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 07:46:06 GMT</pubDate><ttl>60</ttl><item><title>JAVA设计模式系列之Adapter(适配器)(转载)</title><link>http://www.blogjava.net/lidh04/articles/66396.html</link><dc:creator>李承宇</dc:creator><author>李承宇</author><pubDate>Tue, 29 Aug 2006 05:14:00 GMT</pubDate><guid>http://www.blogjava.net/lidh04/articles/66396.html</guid><wfw:comment>http://www.blogjava.net/lidh04/comments/66396.html</wfw:comment><comments>http://www.blogjava.net/lidh04/articles/66396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lidh04/comments/commentRss/66396.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lidh04/services/trackbacks/66396.html</trackback:ping><description><![CDATA[适配器模式定义:<br />将两个不兼容的类纠合在一起使用，属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份.<br /><br />为何使用?<br />我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是：修改各自类的接口，但是如果我们没有源代码，或者，我们不愿意为了一个应用而修改各自的接口。 怎么办? <br /><br />使用Adapter，在这两种接口之间创建一个混合接口(混血儿).<br /><br />如何使用?<br />实现Adapter方式,其实"think in Java"的"类再生"一节中已经提到,有两种方式：组合(composition)和继承(inheritance).<br />假设我们要打桩，有两种类：方形桩 圆形桩.<br />public class SquarePeg{<br />　　public void insert(String str){<br />　　　　System.out.println("SquarePeg insert():"+str);<br />　　}<br /><br />}<br /><br />public class RoundPeg{<br />　　public void insertIntohole(String msg){<br />　　　　System.out.println("RoundPeg insertIntoHole():"+msg);<br />}<br />}<br />现在有一个应用,需要既打方形桩,又打圆形桩.那么我们需要将这两个没有关系的类综合应用.假设RoundPeg我们没有源代码,或源代码我们不想修改,那么我们使用Adapter来实现这个应用:<br /><br />public class PegAdapter extends SquarePeg{<br /><br />　　private RoundPeg roundPeg;<br /><br />　　public PegAdapter(RoundPeg peg)(this.roundPeg=peg;)<br /><br />　　public void insert(String str){ roundPeg.insertIntoHole(str);}<br /><br />}<br />在上面代码中,RoundPeg属于Adaptee,是被适配者.PegAdapter是Adapter,将Adaptee(被适配者RoundPeg)和Target(目标SquarePeg)进行适配.实际上这是将组合方法(composition)和继承(inheritance)方法综合运用.<br /><br />PegAdapter首先继承SquarePeg，然后使用new的组合生成对象方式，生成RoundPeg的对象roundPeg，再重载父类insert()方法。从这里,你也了解使用new生成对象和使用extends继承生成对象的不同,前者无需对原来的类修改,甚至无需要知道其内部结构和源代码.<br /><br />如果你有些Java使用的经验，已经发现，这种模式经常使用。<br />进一步使用<br />上面的PegAdapter是继承了SquarePeg,如果我们需要两边继承，即继承SquarePeg 又继承RoundPeg,因为Java中不允许多继承，但是我们可以实现(implements)两个接口(interface)<br /><br />public interface IRoundPeg{<br />　　public void insertIntoHole(String msg);<br /><br />}<br /><br />public interface ISquarePeg{<br />　　public void insert(String str);<br /><br />}<br /><br />下面是新的RoundPeg 和SquarePeg, 除了实现接口这一区别，和上面的没什么区别。<br />public class SquarePeg implements ISquarePeg{<br />　　public void insert(String str){<br />　　　　System.out.println("SquarePeg insert():"+str);<br />　　}<br /><br />}<br /><br />public class RoundPeg implements IRoundPeg{<br />　　public void insertIntohole(String msg){<br />　　　　System.out.println("RoundPeg insertIntoHole():"+msg);<br />　　}<br />}<br /><br />下面是新的PegAdapter,叫做two-way adapter:<br /><br />public class PegAdapter implements IRoundPeg,ISquarePeg{<br /><br />　　private RoundPeg roundPeg;<br />　　private SquarePeg squarePeg;<br /><br />　　// 构造方法<br />　　public PegAdapter(RoundPeg peg){this.roundPeg=peg;}<br />　　// 构造方法<br />　　public PegAdapter(SquarePeg peg)(this.squarePeg=peg;)<br /><br />　　public void insert(String str){ roundPeg.insertIntoHole(str);}<br /><br />}<br /><br />还有一种叫Pluggable Adapters,可以动态的获取几个adapters中一个。使用Reflection技术，可以动态的发现类中的Public方法。<br /><img src ="http://www.blogjava.net/lidh04/aggbug/66396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lidh04/" target="_blank">李承宇</a> 2006-08-29 13:14 <a href="http://www.blogjava.net/lidh04/articles/66396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>