📄 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 + -