摘要:裝飾器模式解決的問(wèn)題修飾模式,是面向?qū)ο缶幊填I(lǐng)域中,一種動(dòng)態(tài)地往一個(gè)類(lèi)中添加新的行為的設(shè)計(jì)模式??梢钥吹剑@樣的模型很具有擴(kuò)者性,我們可以輕松的添加其他裝飾器給區(qū)域?qū)ο?,且不需要更改其他?lèi),
裝飾器模式解決的問(wèn)題
修飾模式,是面向?qū)ο缶幊填I(lǐng)域中,一種動(dòng)態(tài)地往一個(gè)類(lèi)中添加新的行為的設(shè)計(jì)模式。就功能而言,修飾模式相比生成子類(lèi)更為靈活,這樣可以給某個(gè)對(duì)象而不是整個(gè)類(lèi)添加一些功能。
將所有的功能建立在繼承體系上會(huì)導(dǎo)致系統(tǒng)中的類(lèi)越來(lái)越多,而且當(dāng)你又要修改他們的分支的時(shí)候,可能還會(huì)出現(xiàn)重復(fù)代碼
我們來(lái)看下面這個(gè)例子,為了計(jì)算一塊區(qū)域的價(jià)值,我們把代碼寫(xiě)成下面這個(gè)樣子:
// 區(qū)域抽象類(lèi) abstract class Area { abstract public function treasure(); } //森林類(lèi),價(jià)值100 class Forest extends Area { public function treasure() { return 100; } } //沙漠類(lèi),價(jià)值10 class Desert extends Area { function function treasure() { return 10; } }
上面的代碼看上去好像沒(méi)有什么問(wèn)題,但是如果需要給一片被破壞的森林計(jì)算價(jià)值怎么辦呢,添加DamageForest子類(lèi)么?顯然是不可行的,因?yàn)楹苡锌赡苓€有其他很多類(lèi)型疊加的類(lèi),這會(huì)導(dǎo)致類(lèi)中可能會(huì)有重復(fù)的代碼,且子類(lèi)也會(huì)變的越來(lái)越多。
裝飾器模式的實(shí)現(xiàn)裝飾器模式使用組合和委托,而不是使用繼承來(lái)解決上述的問(wèn)題,我們?cè)趤?lái)看下面改良過(guò)的代碼:
// 區(qū)域抽象類(lèi) abstract class Area { abstract public function treasure(); } //森林類(lèi),價(jià)值100 class Forest extends Area { public function treasure() { return 100; } } //沙漠類(lèi),價(jià)值10 class Desert extends Area { function function treasure() { return 10; } } //區(qū)域類(lèi)的裝飾器類(lèi) abstract class AreaDecorateor extends Area { protected $_area = null; public function __construct(Area $area) { $this->_area = $area; } } //被破壞了后的區(qū)域,價(jià)值只有之前的一半 class Damaged extends AreaDecorateor { public function treasure() { return $this->_area->treasure() * 0.5; } } //現(xiàn)在我們來(lái)獲取被破壞的森林類(lèi)的價(jià)值 $damageForest = new Damaged(new Forest()); echo $damageForest->treasure(); //返回50總結(jié)
上面的調(diào)用方法很像建立了一個(gè)管道,裝飾器模式經(jīng)常被用于創(chuàng)建過(guò)濾器。
可以看到,這樣的模型很具有擴(kuò)者性,我們可以輕松的添加其他裝飾器給區(qū)域?qū)ο?,且不需要更改其他?lèi),
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21361.html
摘要:概念裝飾器模式允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu)。這種類(lèi)型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類(lèi)的一個(gè)包裝。這種模式創(chuàng)建了一個(gè)裝飾類(lèi),用來(lái)包裝原有的類(lèi),并在保持類(lèi)方法簽名完整性的前提下,提供了額外的功能。 概念 裝飾器模式(Decorator Pattern)允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu)。這種類(lèi)型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類(lèi)的...
摘要:我們可以把取消發(fā)貨單和取消訂單看成一個(gè)被觀察或被訂閱的類(lèi)實(shí)例的對(duì)象,一旦發(fā)生取消行為,我們立即通知各個(gè)觀察者做出相對(duì)應(yīng)的行為。裝飾器模式裝飾器思想,不管以前業(yè)務(wù)邏輯,甚至不去讀,調(diào)用之前的接口裝飾上新的數(shù)據(jù),達(dá)到自己的目的。 前言 還是每月的目標(biāo)至少寫(xiě)一篇文章,一晃八月份就要過(guò)去了,這個(gè)月依然沒(méi)有什么產(chǎn)出,毫無(wú)疑問(wèn)最近的狀態(tài)就是不停的工作,不停的加班。所以還是把最近工作進(jìn)行一個(gè)總結(jié),首...
摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類(lèi) Collections 中大概有兩類(lèi)功能,第一類(lèi)是對(duì)容器接口對(duì)象進(jìn)行操作,第二類(lèi)是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類(lèi) Collections 中大概有兩類(lèi)功能,第一類(lèi)是對(duì)容器接口對(duì)象進(jìn)行操作,第二類(lèi)是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
閱讀 2041·2023-04-26 00:16
閱讀 3492·2021-11-15 11:38
閱讀 3184·2019-08-30 12:50
閱讀 3193·2019-08-29 13:59
閱讀 764·2019-08-29 13:54
閱讀 2517·2019-08-29 13:42
閱讀 3319·2019-08-26 11:45
閱讀 2198·2019-08-26 11:36