相關(guān)關(guān)鍵詞
關(guān)于我們
最新文章
- PHP中opcode緩存簡(jiǎn)單用法分析
- thinkPHP控制器變量在模板中的顯示方法示例
- PHP move_uploaded_file() 函數(shù)(將上傳的文件移動(dòng)到新位置)
- dirname(__FILE__)的含義和應(yīng)用說(shuō)明
- thinkPHP5框架實(shí)現(xiàn)分頁(yè)查詢功能的方法示例
- PHP中單雙號(hào)與變量
- PHP獲得當(dāng)日零點(diǎn)時(shí)間戳的方法分析
- Laravel ORM對(duì)Model::find方法進(jìn)行緩存示例詳解
- PHP讀寫文件高并發(fā)處理操作實(shí)例詳解
- 【CLI】利用Curl下載文件實(shí)時(shí)進(jìn)度條顯示的實(shí)現(xiàn)
PHP設(shè)計(jì)模式之裝飾器模式定義與用法詳解
本文實(shí)例講述了PHP設(shè)計(jì)模式之裝飾器模式定義與用法。分享給大家供大家參考,具體如下:
什么是裝飾器模式
作為一種結(jié)構(gòu)型模式, 裝飾器(Decorator)模式就是對(duì)一個(gè)已有結(jié)構(gòu)增加"裝飾".
適配器模式, 是為現(xiàn)在有結(jié)構(gòu)增加的是一個(gè)適配器類,.將一個(gè)類的接口,轉(zhuǎn)換成客戶期望的另外一個(gè)接口.適配器讓原本接口不兼容的類可以很好的合作.
裝飾器模式是將一個(gè)對(duì)象包裝起來(lái)以增強(qiáng)新的行為和責(zé)任.裝飾器也稱為包裝器(類似于適配器)
有些設(shè)計(jì)設(shè)計(jì)模式包含一個(gè)抽象類,而且該抽象類還繼承了另一個(gè)抽象類,這種設(shè)計(jì)模式為數(shù)不多,而裝飾器就是其中之一.
什么時(shí)候使用裝飾器模式
基本說(shuō)來(lái), 如果想為現(xiàn)有對(duì)象增加新功能而不想影響其他對(duì)象, 就可以使用裝飾器模式.如果你好不容易為客戶創(chuàng)建了一個(gè)網(wǎng)站格式, 主要組件的工作都很完美, 客戶請(qǐng)求新功能時(shí), 你肯定不希望推翻重來(lái), 再重新創(chuàng)建網(wǎng)站. 例如, 假設(shè)你已經(jīng)構(gòu)建了客戶原先請(qǐng)求的組件, 之后客戶又有了新的需求, 希望在網(wǎng)站中包含視頻功能. 你不用重寫原先的組件, 只需要"裝飾"現(xiàn)有組件, 為它們?cè)黾右曨l功能. 這樣即可以保持原來(lái)的功能,還可以增加新功能.
有些項(xiàng)目可能有時(shí)需要裝飾, 而有時(shí)不希望裝飾, 這些項(xiàng)目體現(xiàn)了裝飾器設(shè)計(jì)模式的另一個(gè)重要特性.假設(shè)你的基本網(wǎng)站開發(fā)模式可以滿足大多數(shù)客戶的要求. 不過, 胡些客戶還希望有一些特定的功能來(lái)滿足他們的需求. 并不是所有人都希望或需要這些額外的功能. 作為開發(fā)人員, 你希望你創(chuàng)建的網(wǎng)站能滿足客戶的業(yè)務(wù)目標(biāo). 所以需要提供"本地化"(customerization)特性, 即針對(duì)特定業(yè)務(wù)提供的特性. 利用裝飾器模式, 不僅能提供核心功能, 還可以用客戶要求的特有功能"裝飾"這些核心功能.
簡(jiǎn)單的裝飾器例子
一個(gè)web開發(fā)企業(yè),計(jì)劃建立一個(gè)基本網(wǎng)站,并提供一些增強(qiáng)功能. 不過,web開發(fā)人員知道, 盡管這個(gè)基本計(jì)劃適用于大多數(shù)客戶, 但客戶以后很可能還希望進(jìn)一步提升, 利用裝飾器模式, 可以很容易地增加多個(gè)具體裝飾器,另外由于你能選擇要增加的裝飾器, 所以企業(yè)不僅能控制功能, 還可以控制項(xiàng)目的成本 .
Component接口
Component參與者是一個(gè)接口, 在這里, 它是一個(gè)抽象類IComponent. 這個(gè)抽象類只有一個(gè)屬性$site, 另外有兩個(gè)抽象方法getSite()
和getPrice().Component
參與者具體為具體組件和Decorator參與者抽象類建立接口:
IComponent.php
<?php abstract class IComponent { protected $site; abstract public function getSite(); abstract public function getPrice(); }