Adapter Pattern 適配器模式
似曾相識
做過Android Ap開發的朋友一般情況下都會用到Google 提供的BaseAdapter 適配器做擴展,用來填充ListView、GridView 等窗口控件。用過的朋友都會覺得很簡單很方便就可以對控件做一個數據源。而BaseAdapter 正是一個適配器,Google 考慮到適配器的一個特性則可以如此概括用 “既有內容” 去實現 “需要結果” 。
Adapter Pattern
適配器模式共分為兩種:
- 類的 Adapter Pattern (即所謂的繼承)
- 對象的 Adapter Pattern (即所謂的委托)
場景需求
給定的一個字符串,將其按一定風格顯示出來,並打印在 Android 的文本框裡面,按照這個簡單的需求,分別用適配器的這兩種模式來編寫代碼,最終完成的工程目錄包如下:
包名:com.terry.Pattern_one 代表類的繼承
包名:com.terry.Pattern_two 代表對象的委托
模式一,類的繼承:
Banner 類
package com.terry.Pattern_one;
public class Banner {
private String string;
public Banner(String string)
{
this.string=string;
}
public String showWithParen(){
return "("+string+")";
}
public String showWithAster(){
return "*"+string+"*";
}
}
Print接口
package com.terry.Pattern_one;
public interface Print {
public abstract String printWeak();
public abstract String printStrong();
}
PrintBanner 類
package com.terry.Pattern_one;
public class PrintBanner extends Banner implements Print{
public PrintBanner(String string) {
super(string);
// TODO Auto-generated constructor stub
}
@Override
public String printStrong() {
// TODO Auto-generated method stub
return showWithAster();
}
@Override
public String printWeak() {
// TODO Auto-generated method stub
return showWithParen();
}
}
模式一使用 Print 來聲明“需要結果”,接下來使用一個負責適配、轉換的類 PrintBanner 來使用“既有內容”Banner,將既有內容轉換成“需要結果”Print 。可以理解成生活中的交流電一個有220V的交流電(Banner) 通過適配器(PrintBanner) 轉換成日常家電可用的 ( Print) 12V 電流。
模式二,對象的委托:
Print抽象類
package com.terry.Pattern_two;
public abstract class Print {
public abstract String PrintWeak();
public abstract String PrintStrong();
}
PrintBanner 類
package com.terry.Pattern_two;
import com.terry.Pattern_one.Banner;
public class PrintBanner extends Print{
private Banner banner;
public PrintBanner(String string){
banner=new Banner(string);
}
@Override
public String PrintStrong() {
// TODO Auto-generated method stub
return banner.showWithAster();
}
@Override
public String PrintWeak() {
// TODO Auto-generated method stub
return banner.showWithParen();
}
}
“委托”從字面上理解為:將某事交由某人去執行或者代辦。模式二的意思為,將“需要結果”抽象出來(Print ),然後讓PrintBanner 擴展其功能,將Banner 對象存儲在PrintBanner 裡面,當系統調用PrintBanner 的PrintWeak時,並不是自己動手處理,而是把工作委托由“既有內容”Banner 的 showWithParen 代為執行。
在Android 界面上調用和顯示模式的功能:
AdapterPatternActivity 類
package com.terry.AdapterPattern;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import com.terry.Pattern_one.Print;
import com.terry.Pattern_one.PrintBanner;
public class AdapterPatternActivity extends Activity {
private Button one, two;
private EditText etOne, etTwo;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
one = (Button) findViewById(R.id.one);
two = (Button) findViewById(R.id.two);
etOne = (EditText) findViewById(R.id.et_one);
etTwo = (EditText) findViewById(R.id.et_two);
one.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Print p = new PrintBanner("Android Adapter 類的繼承");
etOne.setText(p.printWeak() + "\n" + p.printStrong());
}
});
two.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
com.terry.Pattern_two.Print p = new com.terry.Pattern_two.PrintBanner(
"Android Adapter 對象的委托");
etTwo.setText(p.PrintWeak() + "\n" + p.PrintStrong());
}
});
}
}
顯示效果如下:
經常做項目,自己會有一些自己覺得不錯的類,適配器模式可以把過去的類換個包裝重新建立出需要的類,這個模式可以幫你節省建立必要方法組群的時間,以便減輕寫程序的負擔和工作量。
源碼打包下載:
適配器模式