?? adapterpattern.html
字號:
<!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>
您的電腦是個舊電腦,新的滑鼠都在使用USB接口了,而您的電腦上并沒有USB,而只有一個PS2接口,這時您可以使用一個USB轉PS2的接頭作為轉換,這樣您的電腦就可以使用新滑鼠了(當然您也可以使用USB擴充卡,意思是相同的)。<br>
<br>
類似的概念,有時候您想在原來的程式中加入一個外部元件,例如一個類別,但是這個類別與您目前所設計的程式在介面上并不一致,為了讓這個外部類與原程式的介面一致,您必須使用一個類別作為中介來配接它們,這時您可以采用Adapter模式。<br>
<br>
舉個例子來說,在Java 1.0中有個Enumeration,您在這個版本發行之后,使用它來設計了一個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>
現在Java
1.2中新增了Iterator,您想要使用它的功能,但基本上您不想更動原來程式中已設計好的MessageApplication類別,這時候您可以
使用Adapter模式,將Iterator的介面轉換為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> // 轉接介面<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類別,而不用作任何的變動:<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模式,您原有程式中已設計好的類別不用更動,就可以引進新類別的功能,將上面的程式<span style="font-style: italic;"></span><cite class="urllink"></cite>UML類別結構畫出如下:<br>
<div style="text-align: center;"><img style="width: 408px; height: 150px;" alt="Adapter" title="Adapter" src="images/adapter-1.jpg"><br>
</div>
<br>
上面的作法,是將要引進的新類別當作Adapter類別的一個物件成員,這是Object Adapter模式,其抽象結構如下:<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>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -