設計模式-01
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 implementsIPersonService { 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