日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java real football_Java学习--设计模式之行为型模式(三)

發(fā)布時間:2025/4/16 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java real football_Java学习--设计模式之行为型模式(三) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、空對象模式(Null Object Pattern)

1、概念

在空對象模式(Null Object Pattern)中,一個空對象取代 NULL 對象實例的檢查。Null 對象不是檢查空值,而是反應(yīng)一個不做任何動作的關(guān)系。這樣的 Null 對象也可以在數(shù)據(jù)不可用的時候提供默認的行為。在空對象模式中,我們創(chuàng)建一個指定各種要執(zhí)行的操作的抽象類和擴展該類的實體類,還創(chuàng)建一個未對該類做任何實現(xiàn)的空對象類,該空對象類將無縫地使用在需要檢查空值的地方。

2、實例

我們將創(chuàng)建一個定義操作(在這里,是客戶的名稱)的?AbstractCustomer?抽象類,和擴展了?AbstractCustomer?類的實體類。工廠類?CustomerFactory?基于客戶傳遞的名字來返回?RealCustomer?或?NullCustomer?對象。演示類?NullPatternDemo,我們的演示類使用?CustomerFactory?來演示空對象模式的用法。

(1)、創(chuàng)建一個抽象類

public abstract classAbstractCustomer {protectedString name;public abstract booleanisNil();public abstractString getName();

}

(2)、擴展一個執(zhí)行操作的實體類

public class RealCustomer extendsAbstractCustomer {publicRealCustomer(String name) {this.name =name;

}

@OverridepublicString getName() {returnname;

}

@Overridepublic booleanisNil() {return false;

}

}

(3)、擴展一個不做任何實現(xiàn)的空對象類

public class NullCustomer extendsAbstractCustomer {

@OverridepublicString getName() {return "Not Available in Customer Database";

}

@Overridepublic booleanisNil() {return true;

}

}

(4)、創(chuàng)建?CustomerFactory?類

public classCustomerFactory {public static final String[] names = {"Rob", "Joe", "Julie"};public staticAbstractCustomer getCustomer(String name){for (int i = 0; i < names.length; i++) {if(names[i].equalsIgnoreCase(name)){return newRealCustomer(name);

}

}return newNullCustomer();

}

}

(5)、使用?CustomerFactory,基于客戶傳遞的名字,來獲取?RealCustomer?或?NullCustomer?對象

public classNullPatternDemo {public static voidmain(String[] args) {

AbstractCustomer customer1= CustomerFactory.getCustomer("Rob");

AbstractCustomer customer2= CustomerFactory.getCustomer("Bob");

AbstractCustomer customer3= CustomerFactory.getCustomer("Julie");

AbstractCustomer customer4= CustomerFactory.getCustomer("Laura");

System.out.println("Customers");

System.out.println(customer1.getName());

System.out.println(customer2.getName());

System.out.println(customer3.getName());

System.out.println(customer4.getName());

}

}

(5)、演示結(jié)果

1 Customers2 Rob3 Not Available in Customer Database4 Julie5 Not Available in Customer Database

二、策略模式(Strategy Pattern)

1、概念

在策略模式(Strategy Pattern)中,一個類的行為或其算法可以在運行時更改。這種類型的設(shè)計模式屬于行為型模式。

2、簡介

意圖:定義一系列的算法,把它們一個個封裝起來, 并且使它們可相互替換。

主要解決:在有多種算法相似的情況下,使用 if...else 所帶來的復(fù)雜和難以維護。

何時使用:一個系統(tǒng)有許多許多類,而區(qū)分它們的只是他們直接的行為。

如何解決:將這些算法封裝成一個一個的類,任意地替換。

關(guān)鍵代碼:實現(xiàn)同一個接口。

優(yōu)點:

(1)、算法可以自由切換。

(2)、避免使用多重條件判斷。

(3)、擴展性良好。

缺點:

(1)、策略類會增多。

(2)、所有策略類都需要對外暴露。

使用場景:

(1)、如果在一個系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動態(tài)地讓一個對象在許多行為中選擇一種行為。

(2)、一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種。

(3)、如果一個對象有很多的行為,如果不用恰當?shù)哪J?#xff0c;這些行為就只好使用多重的條件選擇語句來實現(xiàn)。

注意事項:如果一個系統(tǒng)的策略多于四個,就需要考慮使用混合模式,解決策略類膨脹的問題。

3、實例

我們將創(chuàng)建一個定義活動的?Strategy?接口和實現(xiàn)了?Strategy?接口的實體策略類。Context?是一個使用了某種策略的類。演示類?StrategyPatternDemo,我們的演示類使用?Context?和策略對象來演示 Context 在它所配置或使用的策略改變時的行為變化。

(1)、創(chuàng)建一個接口

public interfaceStrategy {public int doOperation(int num1, intnum2);

}

(2)、創(chuàng)建接口的實現(xiàn)類

public class OperationAdd implementsStrategy{

@Overridepublic int doOperation(int num1, intnum2) {return num1 +num2;

}

}

public class OperationSubstract implementsStrategy{

@Overridepublic int doOperation(int num1, intnum2) {return num1 -num2;

}

}

public class OperationMultiply implementsStrategy{

@Overridepublic int doOperation(int num1, intnum2) {return num1 *num2;

}

}

(3)、創(chuàng)建 Context 類

public classContext {privateStrategy strategy;publicContext(Strategy strategy){this.strategy =strategy;

}public int executeStrategy(int num1, intnum2){returnstrategy.doOperation(num1, num2);

}

}

(4)、使用?Context?來查看當它改變策略?Strategy?時的行為變化。

public classStrategyPatternDemo {public static voidmain(String[] args) {

Context context= new Context(newOperationAdd());

System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

context= new Context(newOperationSubstract());

System.out.println("10 - 5 = " + context.executeStrategy(10, 5));

context= new Context(newOperationMultiply());

System.out.println("10 * 5 = " + context.executeStrategy(10, 5));

}

}

(5)、演示結(jié)果

1 10 + 5 = 15

2 10 - 5 = 5

3 10 * 5 = 50

三、模板模式(Template Pattern)

1、概念

在模板模式(Template Pattern)中,一個抽象類公開定義了執(zhí)行它的方法的方式/模板。它的子類可以按需要重寫方法實現(xiàn),但調(diào)用將以抽象類中定義的方式進行。這種類型的設(shè)計模式屬于行為型模式。

2、簡介

意圖:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。

主要解決:一些方法通用,卻在每一個子類都重新寫了這一方法。

何時使用:有一些通用的方法。

如何解決:將這些通用算法抽象出來。

關(guān)鍵代碼:在抽象類實現(xiàn),其他步驟在子類實現(xiàn)。

優(yōu)點:

(1)、封裝不變部分,擴展可變部分。

(2)、提取公共代碼,便于維護。

(3)、行為由父類控制,子類實現(xiàn)。

缺點:每一個不同的實現(xiàn)都需要一個子類來實現(xiàn),導(dǎo)致類的個數(shù)增加,使得系統(tǒng)更加龐大。

使用場景:

(1)、有多個子類共有的方法,且邏輯相同。

(2)、重要的、復(fù)雜的方法,可以考慮作為模板方法。

注意事項:為防止惡意操作,一般模板方法都加上 final 關(guān)鍵詞。

3、實例

我們將創(chuàng)建一個定義操作的?Game?抽象類,其中,模板方法設(shè)置為 final,這樣它就不會被重寫。Cricket?和?Football?是擴展了?Game?的實體類,它們重寫了抽象類的方法。演示類 TemplatePatternDemo,我們的演示類使用?Game?來演示模板模式的用法。

(1)、創(chuàng)建一個抽象類,將他的模板方法設(shè)置為 final

public abstract classGame {abstract voidinitialize();abstract voidstartPlay();abstract voidendPlay();//模板

public final voidplay(){//初始化游戲

initialize();//開始游戲

startPlay();//結(jié)束游戲

endPlay();

}

}

(2)、創(chuàng)建實體游戲類

public class Cricket extendsGame {

@OverridevoidendPlay() {

System.out.println("Cricket Game Finished!");

}

@Overridevoidinitialize() {

System.out.println("Cricket Game Initialized! Start playing.");

}

@OverridevoidstartPlay() {

System.out.println("Cricket Game Started. Enjoy the game!");

}

}

public class Football extendsGame {

@OverridevoidendPlay() {

System.out.println("Football Game Finished!");

}

@Overridevoidinitialize() {

System.out.println("Football Game Initialized! Start playing.");

}

@OverridevoidstartPlay() {

System.out.println("Football Game Started. Enjoy the game!");

}

}

(3)、使用?Game?的模板方法 play() 來演示游戲的定義方式。

public classTemplatePatternDemo {public static voidmain(String[] args) {

Game game= newCricket();

game.play();

System.out.println();

game= newFootball();

game.play();

}

}

(4)、演示結(jié)果

1 Cricket Game Initialized!Start playing.2 Cricket Game Started. Enjoy the game!

3 Cricket Game Finished!

4

5 Football Game Initialized!Start playing.6 Football Game Started. Enjoy the game!

7 Football Game Finished!

四、訪問者模式(Visitor Pattern)

1、概念

在訪問者模式(Visitor Pattern)中,我們使用了一個訪問者類,它改變了元素類的執(zhí)行算法。通過這種方式,元素的執(zhí)行算法可以隨著訪問者改變而改變。這種類型的設(shè)計模式屬于行為型模式。根據(jù)模式,元素對象已接受訪問者對象,這樣訪問者對象就可以處理元素對象上的操作。

2、簡介

意圖:主要將數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)操作分離。

主要解決:穩(wěn)定的數(shù)據(jù)結(jié)構(gòu)和易變的操作耦合問題。

何時使用:需要對一個對象結(jié)構(gòu)中的對象進行很多不同的并且不相關(guān)的操作,而需要避免讓這些操作"污染"這些對象的類,使用訪問者模式將這些封裝到類中。

如何解決:在被訪問的類里面加一個對外提供接待訪問者的接口。

關(guān)鍵代碼:在數(shù)據(jù)基礎(chǔ)類里面有一個方法接受訪問者,將自身引用傳入訪問者。

應(yīng)用實例:您在朋友家做客,您是訪問者,朋友接受您的訪問,您通過朋友的描述,然后對朋友的描述做出一個判斷,這就是訪問者模式。

優(yōu)點:

(1)、符合單一職責原則。

(2)、優(yōu)秀的擴展性。

(3)、靈活性。

缺點:

(1)、具體元素對訪問者公布細節(jié),違反了迪米特原則。

(2)、具體元素變更比較困難。

(3)、違反了依賴倒置原則,依賴了具體類,沒有依賴抽象。

使用場景:

(1)、對象結(jié)構(gòu)中對象對應(yīng)的類很少改變,但經(jīng)常需要在此對象結(jié)構(gòu)上定義新的操作。

(2)、需要對一個對象結(jié)構(gòu)中的對象進行很多不同的并且不相關(guān)的操作,而需要避免讓這些操作"污染"這些對象的類,也不希望在增加新操作時修改這些類。

注意事項:訪問者可以對功能進行統(tǒng)一,可以做報表、UI、攔截器與過濾器。

3、實例

我們將創(chuàng)建一個定義接受操作的?ComputerPart?接口。Keyboard、Mouse、Monitor?和?Computer?是實現(xiàn)了?ComputerPart?接口的實體類。我們將定義另一個接口?ComputerPartVisitor,它定義了訪問者類的操作。Computer?使用實體訪問者來執(zhí)行相應(yīng)的動作。演示類?VisitorPatternDemo,我們的演示類使用?Computer、ComputerPartVisitor?類來演示訪問者模式的用法。

(1)、定義一個表示元素的接口

public interfaceComputerPart {public voidaccept(ComputerPartVisitor computerPartVisitor);

}

(2)、擴展不同訪問的實體類

public class Keyboard implementsComputerPart {

@Overridepublic voidaccept(ComputerPartVisitor computerPartVisitor) {

computerPartVisitor.visit(this);

}

}

public class Monitor implementsComputerPart {

@Overridepublic voidaccept(ComputerPartVisitor computerPartVisitor) {

computerPartVisitor.visit(this);

}

}

public class Mouse implementsComputerPart {

@Overridepublic voidaccept(ComputerPartVisitor computerPartVisitor) {

computerPartVisitor.visit(this);

}

}

public class Computer implementsComputerPart {

ComputerPart[] parts;publicComputer(){

parts= new ComputerPart[] {new Mouse(), new Keyboard(), newMonitor()};

}

@Overridepublic voidaccept(ComputerPartVisitor computerPartVisitor) {for (int i = 0; i < parts.length; i++) {

parts[i].accept(computerPartVisitor);

}

computerPartVisitor.visit(this);

}

}

(3)、定義一個表示訪問者的接口

public interfaceComputerPartVisitor {public voidvisit(Computer computer);public voidvisit(Mouse mouse);public voidvisit(Keyboard keyboard);public voidvisit(Monitor monitor);

}

(4)、創(chuàng)建實現(xiàn)了上述類的實體訪問者

public class ComputerPartDisplayVisitor implementsComputerPartVisitor {

@Overridepublic voidvisit(Computer computer) {

System.out.println("Displaying Computer.");

}

@Overridepublic voidvisit(Mouse mouse) {

System.out.println("Displaying Mouse.");

}

@Overridepublic voidvisit(Keyboard keyboard) {

System.out.println("Displaying Keyboard.");

}

@Overridepublic voidvisit(Monitor monitor) {

System.out.println("Displaying Monitor.");

}

}

(5)、使用?ComputerPartDisplayVisitor?來顯示?Computer?的組成部分。

public classVisitorPatternDemo {public static voidmain(String[] args) {

ComputerPart computer= newComputer();

computer.accept(newComputerPartDisplayVisitor());

}

}

(6)、演示結(jié)果

1 Displaying Mouse.2 Displaying Keyboard.3 Displaying Monitor.4 Displaying Computer.

行為型模式的介紹就到這里了,如有誤,還請各位大佬指正;

總結(jié)

以上是生活随笔為你收集整理的java real football_Java学习--设计模式之行为型模式(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。