?? adapterpattern.html
字號(hào):
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="css/stdlayout.css" type="text/css">
<link rel="stylesheet" href="css/print.css" type="text/css">
<meta content="text/html; charset=gb2312" http-equiv="content-type">
<title>Adapter 模式 - Object Adapter</title>
</head>
<body>
<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>
<h1><a href="CppGossip.html">Design Pattern: Adapter 模式 - Object Adapter</a></h1>
您的電腦是個(gè)舊電腦,新的滑鼠都在使用USB接口了,而您的電腦上并沒有USB,而只有一個(gè)PS2接口,這時(shí)您可以使用一個(gè)USB轉(zhuǎn)PS2的接頭作為轉(zhuǎn)換,這樣您的電腦就可以使用新滑鼠了(當(dāng)然您也可以使用USB擴(kuò)充卡,意思是相同的)。<br>
<br>
類似的概念,有時(shí)候您想在原來的程式中加入一個(gè)外部元件,例如一個(gè)類別,但是這個(gè)類別與您目前所設(shè)計(jì)的程式在介面上并不一致,為了讓這個(gè)外部類與原程式的介面一致,您必須使用一個(gè)類別作為中介來配接它們,這時(shí)您可以采用Adapter模式。<br>
<br>
舉個(gè)例子來說,在Java 1.0中有個(gè)Enumeration,您在這個(gè)版本發(fā)行之后,使用它來設(shè)計(jì)了一個(gè)MessageApplication,例如: <br>
<ul>
<li>MessageApplication.java</li>
</ul>
<span style="font-family: Courier New,Courier,monospace;"></span>
<pre>import java.util.*;<br><br>public class MessageApplication {<br> public void showAllMessage(Enumeration enum) {<br> Object msg;<br> while(enum.hasMoreElements()) { <br> msg = enum.nextElement();<br> System.out.println(msg);<br> }<br> } <br>}</pre>
<br>
您的客戶端程式是這么使用MessageApplication的:<br>
<ul>
<li> MessageClient.java
</li>
</ul>
<pre>import java.util.*;<br><br>public class MessageClient {<br> private MessageApplication msgApp;<br><br> public void run() {<br> Vector vector = new Vector();<br> for(int i = 0; i < 10; i++)<br> vector.addElement("物件 " + i);<br> <br> msgApp = new MessageApplication();<br> msgApp.showAllMessage(vector.elements());<br> }<br> <br> public static void main(String[] args) {<br> MessageClient msgClient = new MessageClient();<br> msgClient.run();<br> }<br>} <br></pre>
<br>
現(xiàn)在Java
1.2中新增了Iterator,您想要使用它的功能,但基本上您不想更動(dòng)原來程式中已設(shè)計(jì)好的MessageApplication類別,這時(shí)候您可以
使用Adapter模式,將Iterator的介面轉(zhuǎn)換為Enumeration相容,例如:<br>
<ul>
<li> IteratorAdapter.java
</li>
</ul>
<pre>import java.util.*;<br><br>public class IteratorAdapter implements Enumeration {<br> private Iterator iterator;<br><br> IteratorAdapter(Iterator iterator) {<br> this.iterator = iterator; <br> }<br><br> // 轉(zhuǎn)接介面<br> public boolean hasMoreElements() {<br> return iterator.hasNext();<br> }<br><br> public Object nextElement() <br> throws NoSuchElementException {<br> return iterator.next();<br> } <br>} <br></pre>
<br>
您可以在客戶端程式中照樣使用MessageApplication類別,而不用作任何的變動(dòng):<br>
<ul>
<li> MessageClient.java </li>
</ul>
<pre>import java.util.*;<br><br>public class MessageClient {<br> // We could still use MessageApplication<br> private Enumeration iteratorAdapter;<br> <br> public void run() {<br> List arrayList = new ArrayList();<br><br> for(int i = 0; i < 10; i++)<br> arrayList.add("物件 " + i);<br> <br> iteratorAdapter = <br> new IteratorAdapter(arrayList.iterator());<br> // We could still use MessageApplication<br> MessageApplication msgApp = new MessageApplication(); <br> msgApp.showAllMessage(iteratorAdapter);<br> }<br><br> public static void main(String[] args) {<br> MessageClient msgClient = new MessageClient();<br> msgClient.run();<br> }<br>} <br></pre>
<p></p>
如程式所示的,透過Adapter模式,您原有程式中已設(shè)計(jì)好的類別不用更動(dòng),就可以引進(jìn)新類別的功能,將上面的程式<span style="font-style: italic;"></span><cite class="urllink"></cite>UML類別結(jié)構(gòu)畫出如下:<br>
<div style="text-align: center;"><img style="width: 408px; height: 150px;" alt="Adapter" title="Adapter" src="images/adapter-1.jpg"><br>
</div>
<br>
上面的作法,是將要引進(jìn)的新類別當(dāng)作Adapter類別的一個(gè)物件成員,這是Object Adapter模式,其抽象結(jié)構(gòu)如下:<br>
<div style="text-align: center;"><img style="width: 345px; height: 176px;" alt="Adapter" title="Adapter" src="images/adapter-2.jpg"><br>
</div>
<br>
</body>
</html>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -