設計模式

 

幾個常用的模式<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

一、創建模式

 

1.  設計模式之Factory(工廠方法和抽象工廠)

    使用工廠模式就象使用new一樣頻繁.

2.  設計模式之Prototype(原型)

    用原型實例指定創建物件的種類,並且通過拷貝這些原型創建新的物件。

3.  設計模式之Builder
    
     汽車由車輪 方向盤 發動機很多部件組成,同時,將這些部件組裝成汽車也是一件複雜的工作,Builder模式就是將這兩種情況分開進行。

4.  設計模式之Singleton(單態)

    保證一個類只有一個實例,並提供一個訪問它的全局訪問點


二、結構模式

1.  設計模式之Facade

     可擴展的使用JDBC針對不同的資料庫編程,Facade提供了一種靈活的實現。
 

2.   設計模式之Proxy

     以Jive爲例,剖析代理模式在用戶級別授權機制上的應用

3.   設計模式之Adapter

      使用類再生的兩個方式:組合(new)和繼承(extends),這個已經在"thinking in java"中提到過。

4.   設計模式之Composite

     就是將類用樹形結構組合成一個單位。你向別人介紹你是某單位,你是單位元元中的一個元素,別人和你做買賣,相當於和單位做買賣。文章中還對Jive再進行了剖析。

5.    設計模式之Decorator

       Decorator是個油漆工,給你的東東的外表刷上美麗的顔色。

6.    設計模式之Bridge

       將"牛郎織女"分開(本應在一起,分開他們,形成兩個介面),在他們之間搭建一個橋(動態的結合)

7.     設計模式之Flyweight

       提供Java運行性能,降低小而大量重複的類的開銷。

三、 行爲模式

1.    設計模式之Template

      實際上向你介紹了爲什麼要使用Java 抽象類,該模式原理簡單,使用很普遍。

2.    設計模式之Memento

      很簡單一個模式,就是在記憶體中保留原來資料的拷貝。

3.    設計模式之Observer

     介紹如何使用Java API提供的現成Observer

4.    設計模式之Chain of Responsibility

     各司其職的類串成一串,好象擊鼓傳花,當然如果自己能完成,就不要推委給下一個。

5.    設計模式之Command

      什麼是將行爲封裝,Command是最好的說明。

6.    設計模式之State

     狀態是編程中經常碰到的實例,將狀態物件化,設立狀態變換器,便可在狀態中輕鬆切換。

7.    設計模式之Strategy

     不同演算法各自封裝,用戶端可隨意挑選需要的演算法。

8.    設計模式之Mediator

Mediator很象十字路口的紅綠燈,每個車輛只需和紅綠燈交互就可以。

9.    設計模式之Interpreter

      主要用來對語言的分析,應用機會不多。

10.   設計模式之Visitor

      訪問者在進行訪問時,完成一系列實質性操作,而且還可以擴展。

11.    設計模式之Iterator

      這個模式已經被用來遍曆Collection中物件。使用頻率很高。在Java中無需專門闡述,在大多數場合也無需自己製造一個Iterator,只要將物件裝入Collection中,我們就直接可以使用Iterator模式。

 

12.  回調模式

 

 

 

外觀模式

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

facade實際上是個理順系統間關係,降低系統間耦合度的一個常用的辦法

 

代理模式

  一、Proxy模式定義:

  爲其他對象提供一種代理以控制這個對象的訪問。又可分爲 靜態代理動態代理

  二、模式解說

Proxy代理模式是一種結構型設計模式,主要解決的問題是:在直接訪問對象時帶來的問題,比如說:要訪問的對象在遠程的機器上。在面向對象系統中,有些對象由於某些原因(比如對象創建開銷很大,或者某些操作需要安全控制,或者需要進程外的訪問),直接訪問會給使用者或者系統結構帶來很多麻煩,我們可以在訪問此對象時加上一個對此對象的訪問層,這個訪問層也叫代理。Proxy模式是最常見的模式,在我們生活中處處可見,例如我們買火車票不一定非要到火車站去買,可以到一些火車票的代售點去買。寄信不一定是自己去寄,可以把信委託給郵局,由郵局把信送到目的地,現實生活中還有很多這樣的例子,就不一一列舉了。

interface GirlInfo{
public void hasBoyFriend();
}


class Girl implements GirlInfo{
public void hasBoyFriend(){
 System.out.println("還沒有男朋友");
 }
}


class Proxy implements GirlInfo{
  private GirlInfo _girl;
  public Proxy(GirlInfo girl){
  _girl=girl;
  }
public void hasBoyFriend(){
 _girl.hasBoyFriend();
 
}
}
public class ProxyClient {
  public static void main(String[] args) {
  GirlInfo girl=new Girl();
     Proxy proxy=new Proxy(girl);
     proxy.hasBoyFriend();
}
  
}

從這個例子我們可以看出,Proxy模式是不是和Adapter模式差不多,都是調用一個已有對象的方法來完成功能。但是他們之間還是有區別的,那就是Proxy模式的目標類必須要實現某個接口,代理類沒有必要實現該接口,模式是死的,它的實現是活的,如果一味的相信某些書上的實現,學習模式也就失去了意義。有的書上稱這種實現爲靜態代理,之所以這樣是爲了區別於Proxy模式在jdk中的另一種實現,jdk中的實現稱爲動態代理。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface GirlInfo{
public void hasBoyFriend();
}

class Girl implements GirlInfo{
  public void hasBoyFriend(){
 System.out.println("還沒有男朋友");
 }
}

class GirlProxy implements InvocationHandler{
private Object delegate;
public Object bind(Object delegate){
 this.delegate=delegate;
 return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 method.invoke(delegate, args);
 return null;
}
}

public class ProxyClient {
  public static void main(String[] args) {
 GirlProxy girlProxy=new GirlProxy();
 GirlInfo girl=(GirlInfo)girlProxy.bind(new Girl());
 girl.hasBoyFriend();
}
  
}

 

適配器模式

《設計模式》中說道:將一個類的接口轉換成客戶希望的另一個接口。Adapter模式使得原本由於接口不兼容而不能一起工作的類可以一起工作。

     在實際的生活中有很多例子,如:我們常使用的移動硬盤,無論是筆記本硬盤還是臺式機硬盤,對於數據的傳輸都不使用Usb的數據線,外接的硬盤盒就是將原來的硬盤數據傳輸方式適合Usb數據線。

適配器模式實現有兩種類型:對象適配器、類適配器。上面的代碼是對象適配器方式。也就是適配器(Queue)中是使用被適配(ArrayList)的對象實現。

Gof《設計模式》中提到了兩種Adapter適配器模式,一種叫對象適配器模式,另一種叫類適配器模式。對象適配器模式的結構如上圖,也就是我剛纔舉的那個例子,那什麼是類適配器模式呢?實際上類適配器模式就是讓Adapter的實現繼承Adaptee。換句話說:類適配器模式是以繼承的方式來實現而對象適配器模式是以組合的方式實現。以前我們說過:繼承增加了模塊間的耦合程度,而組合降低了耦合程度,所以有人建議多使用對象適配器模式,少用類適配器模式。

 

裝飾模式

Decorator裝飾模式是一種結構型模式,它主要是解決:“過度地使用了繼承來擴展對象的功能”,動態地給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比生成子類更爲靈活。

比如: Java I/O API就是使用Decorator 實現的,I/O變種很多,如果想把 BufferStream的額外功能加到 每個stream子類裏,採取繼承方法,將會產生很多子類,顯然相當繁瑣.

我們先建立一個接口:

public interface Work
{  public void insert();

}

接口Work有一個具體實現:插入方形樁或圓形樁,這兩個區別對Decorator是無所謂.我們以插入方形樁爲例:

public class SquarePeg implements Work{
  public void insert(){
    System.out.println("方形樁插入");
  }

}

 

public class RoundPeg implements Work{
  public void insert(){
    System.out.println("圓形樁插入");
  }

}

 

public class Decorator implements Work{

  private Work work;
  public Decorator(Work work){
    this.work=work;
  }

  public void insert(){

    this.work.insert();

newMethod();
  }


  //在新方法中,我們在insert之前增加其他方法,這裏次序先後是用戶靈活指定的   
  public void newMethod(){
         System.out.println("
額外的花邊!");
  }

}

在上例中,我們把挖坑和釘木板都排在了打樁insert前面,這裏只是舉例說明額外功能次序可以任意安排.

好了,Decorator模式出來了,我們看如何調用:

Work squarePeg = new SquarePeg();

Work roundPeg = new RoundPeg();

Work decorator = new Decorator(squarePeg);
decorator.insert();

或者

Work decorator = new Decorator(roundPeg);
decorator.insert();

Decorator模式至此完成.

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章