设计模式示例_介体设计模式示例
設計模式示例
本文是我們名為“ Java設計模式 ”的學院課程的一部分。
在本課程中,您將深入研究大量的設計模式,并了解如何在Java中實現和利用它們。 您將了解模式如此重要的原因,并了解何時以及如何應用模式中的每一個。 在這里查看 !
目錄
1.簡介 2.什么是中介者模式 3.實施中介者模式 4.何時使用中介模式 5. JDK中的中介者模式 6.下載源代碼1.簡介
當今世界在軟件上運行。 現在,軟件幾乎可以在所有事物中運行,不僅可以在計算機中使用。 智能電視,移動電話,手表,洗衣機等具有用于操作機器的嵌入式軟件。
一家大型電子公司要求您開發軟件來操作其新的全自動洗衣機。 該公司為您提供了硬件規格和機器的工作知識。 在規格中,他們為您提供了機器支持的不同洗滌程序。 他們想生產一種全自動洗衣機,需要幾乎0%的人機交互。 用戶只需要用水龍頭連接機器即可供水,裝載要洗滌的衣服,將機器的衣服類型設置為棉,絲綢或牛仔布等,在各自的托盤上提供洗滌劑和柔軟劑,然后按開始按鈕。
機器應足夠智能,以根據需要將水倒入滾筒中。 根據衣物的類型,應通過打開加熱器自行調節洗滌溫度。 它應啟動電動機并根據需要旋轉滾筒,根據衣物的需要沖洗,必要時使用去污劑,還應使用柔軟劑。
作為面向對象的開發人員,您開始分析和分類對象,類及其關系。 讓我們檢查一些重要的類和系統的各個部分。 首先是Machine類,它有一個鼓。 因此,一個鼓類,一個加熱器,一個檢查溫度的傳感器,一個電動機。 此外,該機器還具有一個控制供水的閥,除污劑,清潔劑和軟化劑。
這些類之間的關系非常復雜,并且關系也各不相同。 請注意,當前我們僅采用機器的高級抽象。 如果我們在設計時不考慮很多OOP原理和模式,那么初始設計將非常緊密地耦合在一起并且難以維護。 這是因為上述類應相互聯系以完成工作。 例如,“機器”類應要求“閥門”類打開閥門,或者“電動機”應根據洗滌程序設置(由機器中的衣物類型設置)以一定的rpm旋轉滾筒。 某些類型的衣服需要柔軟劑或去污劑,而其他類型則不需要,或者應根據衣服的類型設置溫度。
如果我們允許類直接相互聯系,即通過提供參考,則設計將變得非常緊密且難以維護。 在不影響另一個類別的情況下改變一個類別將變得非常困難。 更糟糕的是,類別之間的關系會根據洗滌程序的不同而有所變化,例如不同類型衣服的溫度不同。 因此,這些類將無法重用。 更糟糕的是,為了支持所有的清洗程序,我們需要在代碼中放入if-else之類的控制語句,這會使代碼更加復雜且難以維護。
為了使這些對象彼此分離,我們需要一個介體,該介體將代表另一個對象接觸該對象,從而在它們之間提供松散的耦合。 該對象僅需要了解介體,并對其執行操作。 介體將對所需的基礎對象執行操作,以完成工作。
中介者模式最適合于此,但在實施它以解決我們的問題之前。 首先讓我們進一步了解介體設計模式。
2.什么是中介者模式
介體模式定義了一個對象,該對象封裝了一組對象之間的交互方式。 介體通過防止對象之間顯式地相互引用來促進松散耦合,并且它使您可以獨立地更改其交互。
對象不是直接彼此交互,而是要求介體代表它們交互,這導致可重用性和松散耦合。 它封裝了對象之間的交互并使它們彼此獨立。 這使他們可以通過實現不同的介體以完全不同的方式改變與其他對象的交互。 介體有助于降低類的復雜性。 每個對象不再需要詳細了解如何與其他對象交互。 對象之間的耦合從緊密和脆弱變為松散和敏捷。
在Mediator之前,類之間的交互可能看起來像這樣,包含彼此的引用。
圖1
現在,在實現介體后,類之間的交互看起來像這樣,只包含對介體的引用。
圖2
每當您擁有緊密耦合的一組對象時,Mediator設計模式就應該是您的首選。 如果一系列對象中的每個對象都必須了解其他對象的內部細節,并且維持這些關系成為問題,請考慮使用調解器。 使用調解器意味著交互代碼只能駐留在一個地方,這使得維護更加容易。 使用調解器可能會隱藏一個更嚴重的問題:如果您有多個對象緊密耦合,則封裝可能有問題。 現在可能是重新考慮如何將程序分解為對象的時候了。
讓我們看一下介體模式的更正式結構。
圖3
具有調解員參考的類稱為同事。 調解員模式的主要參與者是:
3.實施中介者模式
現在,我們將看到介體模式如何使洗衣機的設計更好,可重復使用,可維護且松耦合。
package com.javacodegeeks.patterns.mediatorpattern;public interface MachineMediator {public void start();public void wash();public void open();public void closed();public void on();public void off();public boolean checkTemperature(int temp);}MachineMediator是充當通用介體的接口。 該接口包含一個對象調用另一個對象的操作。
package com.javacodegeeks.patterns.mediatorpattern;public interface Colleague {public void setMediator(MachineMediator mediator);}Colleague界面有一種為具體同事的班級設置調解員的方法。
package com.javacodegeeks.patterns.mediatorpattern;public class Button implements Colleague {private MachineMediator mediator;@Overridepublic void setMediator(MachineMediator mediator){this.mediator = mediator;}public void press(){System.out.println("Button pressed.");mediator.start();}}上面的Button類是一個同事類,其中包含對調解器的引用。 用戶按下按鈕,該按鈕調用此類的press()方法,該按鈕又調用具體介體類的start()方法。 這start()調解的方法調用start()的機器類的代表的方法Button類。
稍后,我們將看到中介者類的結構。 但是現在讓我們首先看看其余的同事課堂。
package com.javacodegeeks.patterns.mediatorpattern;public class Machine implements Colleague {private MachineMediator mediator;@Overridepublic void setMediator(MachineMediator mediator){this.mediator = mediator;}public void start(){mediator.open();}public void wash(){mediator.wash();} }上面保留對中介程序的引用的Machine類具有start()方法,如上所述,該按鈕由中介程序類在按下按鈕時調用。 該方法具有介體的open()方法,該介體又調用Valve類的open()方法以打開機器的閥門。
package com.javacodegeeks.patterns.mediatorpattern;public class Valve implements Colleague {private MachineMediator mediator;@Overridepublic void setMediator(MachineMediator mediator){this.mediator = mediator;}public void open(){System.out.println("Valve is opened...");System.out.println("Filling water...");mediator.closed();}public void closed(){System.out.println("Valve is closed...");mediator.on();} }Valve類有兩種方法,一種是open()方法,用于打開閥門;另一種是,在注滿水時,它稱為closed()方法。 但是請注意,它不是直接調用closed()方法,而是調用調解器的closed()方法,該調解器會調用此類的方法。
關閉閥門后,它會打開加熱器,但再次調用調解員的方法,而不是直接調用加熱器的方法。
package com.javacodegeeks.patterns.mediatorpattern;public class Heater implements Colleague {private MachineMediator mediator;@Overridepublic void setMediator(MachineMediator mediator){this.mediator = mediator;}public void on(int temp){System.out.println("Heater is on...");if(mediator.checkTemperature(temp)){System.out.println("Temperature is set to "+temp);mediator.off();}}public void off(){System.out.println("Heater is off...");mediator.wash();} }加熱器的on()方法打開加熱器并根據需要設置溫度。 它還檢查是否達到所需的溫度,然后off()方法。 通過調解器檢查溫度并關閉加熱器。
關閉后,它將通過中介程序調用Machine類的wash()方法以開始清洗。
如該公司所述,洗衣機具有一套洗滌程序,該軟件應支持所有這些程序。 以下介體實際上是機器的清洗程序之一。 下面的介體被設置為棉花的洗滌程序,因此相應地設置了諸如溫度,轉鼓紡紗速度,去污水平等參數。 我們可以在不更改現有同事類別的情況下為不同的洗滌程序使用不同的介體,從而提供松散的耦合性和可重用性。 所有這些同事類別都可以與機器的其他清洗程序一起重復使用。
package com.javacodegeeks.patterns.mediatorpattern;public class CottonMediator implements MachineMediator{private final Machine machine;private final Heater heater;private final Motor motor;private final Sensor sensor;private final SoilRemoval soilRemoval;private final Valve valve;public CottonMediator(Machine machine,Heater heater,Motor motor,Sensor sensor,SoilRemoval soilRemoval,Valve valve){this.machine = machine;this.heater = heater;this.motor = motor;this.sensor = sensor;this.soilRemoval = soilRemoval;this.valve = valve;System.out.println(".........................Setting up for COTTON program.........................");}@Overridepublic void start() {machine.start();}@Overridepublic void wash() {motor.startMotor();motor.rotateDrum(700);System.out.println("Adding detergent");soilRemoval.low();System.out.println("Adding softener");}@Overridepublic void open() {valve.open();}@Overridepublic void closed() {valve.closed();}@Overridepublic void on() {heater.on(40);}@Overridepublic void off() {heater.off();}@Overridepublic boolean checkTemperature(int temp) {return sensor.checkTemperature(temp);}}CottonMediator類實現MachineMediator接口并提供所需的方法。 這些方法是同事對象為了完成工作而執行的操作。 上面的調解器類僅代表另一個同事對象調用同事對象的方法即可實現此目的。
還有其他一些支持類:
package com.javacodegeeks.patterns.mediatorpattern;public class Sensor {public boolean checkTemperature(int temp){System.out.println("Temperature reached "+temp+" *C");return true;}}Heater使用Sensor類別來檢查溫度。
package com.javacodegeeks.patterns.mediatorpattern;public class SoilRemoval {public void low(){System.out.println("Setting Soil Removal to low");}public void medium(){System.out.println("Setting Soil Removal to medium");}public void high(){System.out.println("Setting Soil Removal to high");} }SoilRemoval類是由使用Machine類。
為了感覺到介體模式的優勢和力量,讓我們以另一個用作牛仔布洗滌程序的介體為例。 現在,我們只需要創建一個新的介體并在其中設置洗牛仔布的規則即可:諸如溫度,鼓旋轉的速度,是否需要軟化劑,去污水平等規則。無需更改現有結構中的任何內容。 不需要諸如“ if-else”之類的條件語句,這會增加復雜性。
package com.javacodegeeks.patterns.mediatorpattern;public class DenimMediator implements MachineMediator{private final Machine machine;private final Heater heater;private final Motor motor;private final Sensor sensor;private final SoilRemoval soilRemoval;private final Valve valve;public DenimMediator(Machine machine,Heater heater,Motor motor,Sensor sensor,SoilRemoval soilRemoval,Valve valve){this.machine = machine;this.heater = heater;this.motor = motor;this.sensor = sensor;this.soilRemoval = soilRemoval;this.valve = valve;System.out.println(".........................Setting up for DENIM program.........................");}@Overridepublic void start() {machine.start();}@Overridepublic void wash() {motor.startMotor();motor.rotateDrum(1400);System.out.println("Adding detergent");soilRemoval.medium();System.out.println("Adding softener");}@Overridepublic void open() {valve.open();}@Overridepublic void closed() {valve.closed();}@Overridepublic void on() {heater.on(30);}@Overridepublic void off() {heater.off();}@Overridepublic boolean checkTemperature(int temp) {return sensor.checkTemperature(temp);}}您可以清楚地看到兩個調解器類之間的差異。 溫度不同,紡絲速度也不同,牛仔布洗滌不需要軟化劑。
現在測試這些介體。
package com.javacodegeeks.patterns.mediatorpattern;public class TestMediator {public static void main(String[] args) {MachineMediator mediator = null;Sensor sensor = new Sensor();SoilRemoval soilRemoval = new SoilRemoval();Motor motor = new Motor();Machine machine = new Machine();Heater heater = new Heater();Valve valve = new Valve();Button button = new Button();mediator = new CottonMediator(machine, heater, motor, sensor, soilRemoval, valve);button.setMediator(mediator);machine.setMediator(mediator);heater.setMediator(mediator);valve.setMediator(mediator);button.press();System.out.println("******************************************************************************");mediator = new DenimMediator(machine, heater, motor, sensor, soilRemoval, valve);button.setMediator(mediator);machine.setMediator(mediator);heater.setMediator(mediator);valve.setMediator(mediator);button.press();}}上面的程序將具有以下輸出:
.........................Setting up for COTTON program......................... Button pressed. Valve is opened... Filling water... Valve is closed... Heater is on... Temperature reached 40 *C Temperature is set to 40 Heater is off... Start motor... Rotating drum at 700 rpm. Adding detergent Setting Soil Removal to low Adding softener ****************************************************************************** .........................Setting up for DENIM program......................... Button pressed. Valve is opened... Filling water... Valve is closed... Heater is on... Temperature reached 30 *C Temperature is set to 30 Heater is off... Start motor... Rotating drum at 1400 rpm. Adding detergent Setting Soil Removal to medium No softener is required在上面的類中,我們創建了所需的對象,調解器(或者可以說不同的清洗程序),然后將清洗程序設置為同事,反之亦然,并在按鈕對象上調用了start()方法以啟動機器。 其余的自動完成,無需任何人工干預。
請注意,僅在使用其他洗滌程序時,設置了其他介體,其余的保持不變。 您可以從輸出中清楚地看到差異。
4.何時使用中介模式
5. JDK中的中介者模式
JDK中幾乎所有地方都使用了設計模式。 以下是JDK中介體模式的用法。
6.下載源代碼
這是“調解員模式”的一課。 您可以在此處下載源代碼: MediatorPattern-Project
翻譯自: https://www.javacodegeeks.com/2015/09/mediator-design-pattern.html
設計模式示例
總結
以上是生活随笔為你收集整理的设计模式示例_介体设计模式示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 历史上封狼居胥的人有几个(古代封狼居胥的
- 下一篇: 怎么设置来电归属地(怎样设置来电显示归属