抽象類和模板方法模式

2021-09-22 21:19:06 字數 3716 閱讀 6811

抽象方法和抽象類

抽象類:用abstract修飾符修飾的類,如:

public

abstract

class

generalservice

抽象方法:用abstract修飾符修飾的方法,抽象方法不能有方法體,如:

public

abstract

void

service()

;

抽象類和抽象方法的規則如下:

必須用abstract修飾符修飾

抽象類不一定包含抽象方法,但含有抽象方法的類一定是抽象類

抽象類不能被例項化

抽象類的構造器不能用於建立物件,主要是用於被其子類呼叫

下面定義乙個shape抽象類:

/**

* 定義乙個抽象類,用於描述抽象概念的「形狀」

*/public

abstract

class

shape

public

void

setcolor

(string color)

// 帶參構造器

public

shape

(string color)

// 定義乙個計算周長的抽象方法

public

abstract

double

calperimeter()

;}

上面的shape類中包含了乙個抽象方法calperimeter(),所以shape類只能是抽象類。shape類中既包含初始化塊,又包含構造器,不過這些都不是在建立shape物件時被呼叫的,而是在建立其子類物件時被呼叫。

下面定義乙個********類和乙個circle類,讓他們繼承shape類,並實現shape中的抽象方法calperimeter()

/**

* 定義乙個三角形類,繼承自形狀類

*/public

class

********

extends

shape

@override

public

double

calperimeter()

}

/**

* 定義乙個圓形類,繼承自形狀類

*/public

class

circle

extends

shape

@override

public

double

calperimeter()

}

shape(形狀)類是乙個抽象的概念,********(三角形)類和circle(圓形)類是shape的具象,它們都各自實現了shape的calperimeter()方法,兩者計算周長的公式不一樣。

下面是測試類:

/**

* 測試類

*/public

class

test

}

輸出結果:

三角形s1的顏色:黃色,周長:12.0

圓形s2的顏色:紅色,周長:18.84955592153876

抽象類的作用

抽象類是從多個具體類中抽象出來的父類,它具有更高層次的抽象,描述了一組事物的共性。

抽象類作為多個子類的通用模板,子類在抽象類的基礎上進行擴充套件、改造,但子類總體上會大致保留抽象類的行為方式。

模板方法模式

如果編寫乙個抽象父類,父類提供了多個子類的通用方法,並把乙個或多個方法留給其子類去實現,這就是模板模式,是一種十分常見且簡單的設計模式。

稍微專業一點的定義就是:

模板方法模式,在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。

下面再介紹乙個模板方法模式的範例,在這個範例中,我們把做菜這個過程分為三個步驟:

備料烹製裝盤

這三部就是演算法的骨架。然而做不同的菜,需要備的料,烹製的方法,以及如何裝盤都是不同的,做不同的菜時,需要有不一樣的實現。

先來寫乙個抽象的做菜父類,**如下:

/**

* 定義做菜抽象類

*/public

abstract

class

dodishtemplate

/** * 備料

*/public

abstract

void

preparation()

;/**

* 烹製

*/public

abstract

void

doing()

;/**

* 裝盤

*/public

abstract

void

sabot()

;}

下面再定義做番茄炒蛋類和做紅燒肉類並實現父類中的抽象方法:

/**

* 做番茄炒蛋類

*/public

class

eggswithtomato

extends

dodishtemplate

@override

public

void

doing()

@override

public

void

sabot()

}

/**

* 做紅燒肉類

*/public

class

bouilli

extends

dodishtemplate

@override

public

void

doing()

@override

public

void

sabot()

}

在測試類中我們來做菜:

public

class

}

執行結果:

洗並切西紅柿,打雞蛋。

雞蛋倒入鍋裡,然後倒入西紅柿一起炒。

將炒好的番茄炒蛋裝入碟子裡,撒上香蔥。

----

----

----

----

----

----

----

-切豬肉和土豆。

將切好的豬肉倒入鍋中炒一會然後倒入土豆連炒帶燉。

將做好的紅燒肉盛進碗裡,撒上白芝麻

從這個案例我們可以看到,dodishtemplate類裡定義了做菜的通用演算法,而一些具體的實現細節則推遲到了其子類(eggswithtomato和bouilli)中。也就是說,模板方法定義了乙個演算法的步驟,並允許子類為乙個或多個步驟提供實現

抽象類 模板方法設計模式

一 抽象類的應用 1 概念 當多個類存在相同的功能時,我們就可以把這些功能提出出來,單獨封裝在乙個類裡面,只提出方法名,不提出方法實體就是功能的主體部分不同,我們進行向上抽取,只抽取功能的定義部分,不抽取功能的主體。2 abstract,抽象的,可以修飾類和方法,被修飾的方法只能有方法名,沒有方法實...

抽象類的模板方法設計模式

一 前言 抽象類體現的就是一種模板模式的設計,抽象類作為多個子類的通用模板,子類在抽象類的基礎上進行擴充套件 改造,但子類總體上會保留抽象類的行為方式。二 模板方法能解決的問題 1 當功能內部一部分實現是確定的,一部分實現是不確定的。這時可以把不確定的部分暴露出去,讓子類去實現。2 編寫乙個抽象父類...

抽象類應用 模板模式

公司的專案中有乙個這樣需求,客戶要求對不同的資訊進行匯出功能,如使用者資訊 商品資訊 訂單資訊等等,並且要求數量太大的匯出要進行非同步處理,專案中就採用了模板模式進行了處理。需求確定了,解決方法也確定了,那我們先來看一下模板模式的定義 定義乙個操作中的演算法的框架,而將一些步驟延遲到子類中,使得子類...