設計模式學習筆記,設計模式讀書筆記
HeadFirst設計模式一、適配器模式 | Adapter Pattern
ListView用於顯示列表資料,但是作為列表資料集合有很多形式,有Array,有Cursor等,我們需要對應的適配器作為橋樑,處理相應的資料(並能形成ListView所需要的視圖)。
正是因為定義了這些適配器介面和適配器類,才能使我們的資料簡單靈活而又正確的顯示到了adapterview的實作類別上。
在設計模式體系中屬於結構型模式,分為三類:
- 類的適配器模式
- 對象的適配器模式
- 介面的適配器模式
由於類和介面的適配器模式需要適配器繼承原有的類,而純物件導向語言Java、C#都是不支援多繼承的,這在一定程度上制約了類和介面的適配器模式的使用情境,故使用的時候要注意。
使用目的:將一個類的介面轉換成客戶希望的另外一個介面。適配器模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。
類適配器模式
說明:
當新介面出現的時候,由於和老的介面不相容,這個時候,我們採用一個適配器類實現新的介面並且繼承老的業務類,這樣就能同時處理新老業務。
範例程式碼:
/** * 原始類 */class Source { public void oldFunction() { System.out.println("oldFunction:Source"); }}interface Target { void oldFunction(); // 新介面 void newFunction();}// 適配器,用來做介面轉換class Adapter extends Source implements Target { public Adapter() { super(); } @Override public void newFunction() { System.out.println("newFunction:Adapter"); }}public class A { public static void main(String args[]) { Target target = new Adapter(); target.oldFunction(); target.newFunction(); }}
輸出:
oldFunction:SourcenewFunction:Adapter
對象適配器模式
說明:當新介面出現的時候,由於和老的介面不相容,這個時候,我們採用一個適配器類實現新的介面並在內部持有一個老商務邏輯的對象,這樣就能把對老介面的調用全部中轉給老的商務邏輯,從而解決介面的相容性問題
範例程式碼:
/** * 原始類 */class Source { public void oldFunction() { System.out.println("oldFunction:Source"); }}interface Target { void oldFunction(); // 新介面 void newFunction();}// 適配器,用來做介面轉換class Adapter implements Target { // 適配器內部持有的原始類對象 private Source mSource; public Adapter(Source source) { mSource = source; } @Override public void oldFunction() { // 這裡調用原始類中的方法 mSource.oldFunction(); } @Override public void newFunction() { System.out.println("newFunction:Adapter"); }}public class A { public static void main(String args[]) { Source source = new Source(); Target target = new Adapter(source); target.oldFunction(); target.newFunction(); }}
輸出:
oldFunction:SourcenewFunction:Adapter
介面適配器模式
說明:也叫預設適配器模式,主要解決介面的複用問題:有時候可能我們的業務只需要使用介面中的某一個方法而不是全部方法,但是由於介面的語言特性而不得不實現全部的抽象方法,這樣就會使得介面的使用過程很麻煩,特別是介面中存在很多抽象方法的時候。面對介面的這類問題,我們可以採用一個抽象類別(也可以不是抽象類別)去實現介面,然後讓我們的類去繼承這個抽象類別同時只重寫我們感興趣的方法即可。
範例程式碼:
interface Target { void function1(); void function2(); void function3(); void function4();}//TargetWrapper實現了Target介面,並給出了預設實現abstract class TargetWrapper implements Target { @Override public void function1() { System.out.println("function1:TargetWrapper"); } @Override public void function2() { } @Override public void function3() { } @Override public void function4() { }}// 適配器,繼承TargetWrapper,重寫自己感興趣的方法class Adapter extends TargetWrapper { public Adapter() { super(); } @Override public void function2() { System.out.println("function4:Adapter"); }}public class A { public static void main(String args[]) { Target target = new Adapter(); target.function1(); target.function2(); }}
輸出:
function1:TargetWrapperfunction4:Adapter
二、原廠模式 | Factory Pattern
著作權聲明:本文原創,轉載請註明出處:http://blog.csdn.net/zhoumushui