1. 程式人生 > >設計模式-01

設計模式-01

arr 觀察者 pack implement 會有 實例 new ring ride

1 接口設計模式

  適用於:需要對一個類或一組類的方法進行定義或重定義的場景

package com.beifeng.hadoop.pattern.interfacee;
/**
 * @Description 接口定義
 */
public interface IPersonService {
    String getName();
    void sayHello();
}
package com.beifeng.hadoop.pattern.interfacee;
/**
 * @Description 接口實現類
 */
public class PersonServiceImpl implements
IPersonService { public String getName() { return this.getClass().getName(); } public void sayHello() { System.out.println("hello "+getName()); } }

2 適配器模式(adapter)

  設計目標:使用不同接口的類所提供的服務為客戶端提供它所期望的接口
  使用場景:如果客戶端已經提供了接口和實現類,但不能滿足需要時,自定義一個新的類繼承原實現類並實現接口
  2.2 分類:
     類適配器:新的適配器類實現需要的接口,並繼承現有的類
    對象適配器(沒有接口的情況):繼承實現類,並在內部引用現有類, 如果適配類需要從多個對象中獲取信息,通常也使用對象適配器

package com.beifeng.hadoop.pattern.adapter;
import com.beifeng.hadoop.pattern.interfacee.PersonServiceImpl;
/**
 * @Description 客戶端實現類
 */
public class ClientPerServiceImpl extends PersonServiceImpl{ 
}
package com.beifeng.hadoop.pattern.adapter;
import com.beifeng.hadoop.pattern.interfacee.IPersonService;
/** * @Description 類適配器:繼承現有實現類並實現接口 */ public class ClassPersonServeiceImpl extends ClientPerServiceImpl implements IPersonService { public void showClient() { System.out.println("client is "+System.getProperty("os.name")); } }
package com.beifeng.hadoop.pattern.adapter;
import com.beifeng.hadoop.pattern.interfacee.PersonServiceImpl;
/**
 * @Description 對象適配器:假如沒有接口提供
 */
public class ObjectPersonServiceImpl extends PersonServiceImpl {
    private ClientPerServiceImpl clientPerServiceImpl;
    public ObjectPersonServiceImpl(ClientPerServiceImpl clientPerServiceImpl) {
        super();
        this.clientPerServiceImpl = clientPerServiceImpl;
    }
    @Override
    public String getName() {
        return clientPerServiceImpl.getName();
    }
    @Override
    public void sayHello() {
        System.out.println("client is "+System.getProperty("os.name"));
        clientPerServiceImpl.sayHello();
    }  
}

3 外觀模式 (facade)

  目標:簡化工具包的使用,為子系統提供一個接口,便於使用
  實例程序:可以獨立運行,卻無法重用,僅用於演示使用子系統的方法
  外觀類:可配置,可重用類,提供了高層次的接口,使得子系統使用更加方便。

4 合成模式(composite):一組對象的組合

  目標:為了保證客戶端調用但對象和組合對象的一致性

  兩個特征:

    1) 組對象允許包含單對象,也可以包含其他的組對象

    2 ) 組合對象和單對象定義共同的行為

5 橋接模式(bridge)

  使用場景:某個類具有兩個或兩個以上的維度變化,如果只使用繼承設計將會很臃腫,可以將繼承關系改為耦合關系

6 觀察者模式(observer)

  目標:在多個對象之間定義一對多的依賴關系,當一個對象的狀態發生改變時,會通知依賴他的對象,並根據新狀態做出相應的反應。

  實現步驟:被觀察者中添加觀察者列表,當被觀察者發生變化時,調用方法,通知觀察者列表中的所用觀察者的方法

   主題接口(被觀察者接口)的 3個基本操作:註冊新的觀察者,通知所有觀察者更新數據,移除取消觀察的觀察者對象

/**主題接口:被觀察者 3個基本操作:註冊新的觀察者,通知所有觀察者更新數據,移除取消觀察的觀察者對象*/
public interface Subject {
    //註冊觀察者
    void registerObserver(Observer observer);
    //移除取消觀察的觀察者對象
    void removeOberver(Observer observer);
    //通知所用觀察者
    void notifyObervers();
}
/**被觀察者實現類,氣象站 */
public class WeatherData implements Subject {
    //觀察者列表
    private ArrayList<Observer> observers;
    private float temperature;//溫度
    public WeatherData() {
        observers=new ArrayList<Observer>();
    }
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }
    public void removeOberver(Observer observer) {
        int i=observers.indexOf(observer);
        if (i!=-1) {
            observers.remove(i);
        }
    }
    public void notifyObervers() {
        if (observers!=null&&observers.size()>0) {
            for(Observer observer:observers){
                observer.update(temperature);
            }
        }
    }
    public float getTemperature() {
        return temperature;
    }
    public void setTemperature(float temperature) {
        this.temperature = temperature;
        notifyObervers();
    }
}

7 調停者模式(mediator)

  設計目標:定義一個對象,封裝一組對象的交互,從而降低對象間的耦合度,避免對象間的顯示引用,而且可以獨立地改變對象的行為。

  適用場景:多個對象彼此互相作用,可以創建一個中間對象,讓該對象持有多個對象的引用,而多個對象持有中間對象的引用,此時,

        多個對象都稱為同事對象,而中間對象稱為調停者對象,當同事對象發生變化時可以,對用調停者對象通知要影響的同事對象

  實例:使用電腦來看電影

    在日常生活中,我們經常使用電腦來看電影,把這個過程描述出來,簡化後假定會有如下的交互過程:

    (1)首先是光驅要讀取光盤上的數據,然後告訴主板,它的狀態改變了。

    (2)主板去得到光驅的數據,把這些數據交給CPU進行分析處理。

    (3)CPU處理完後,把數據分成了視頻數據和音頻數據,通知主板,它處理完了。

    (4)主板去得到CPU處理過後的數據,分別把數據交給顯卡和聲卡,去顯示出視頻和發出聲音。

    要使用調停者模式來實現示例,那就要區分出同事對象和調停者對象。很明顯,主板是調停者,而光驅、聲卡、CPU、顯卡等配件,都是作為同事對象。

設計模式-01