1. 程式人生 > >PHP設計模式之裝飾者模式

PHP設計模式之裝飾者模式

介紹 裝飾者模式動態地將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。 思維導圖

裝飾者模式

有這樣一個專案,做一個餐廳訂餐系統。起初的程式碼結構是這樣的。前面有很多Beverage的繼承類,現在遇到的問題是牛奶的價錢上漲了,那麼所有相關的類,我們都要進行調整,比如Milk,SugarAndMilk類,這種類還有很多,我們需要逐個去修改類中的方法——開發人員每次都做這種事情,要瘋了!所以我們要改變現有的結構。以下的圖都是簡圖,實際的圖,可沒有這麼簡單。

 設計問題:

1》類數量爆炸,有很多類,難以維護;

2》整個設計呆板;

3》基類加入的新功能無法使用於子類;

複用類方法的方式很多,比如繼承,組合,委託。為什麼老是習慣用繼承呢?我看Zend Framework也有這種習慣!每次找對應方法,一直往上翻。——題外話!!!!

 後來經過小組研究決定,我們決定把基礎類抽出來,比如,我們把咖啡做成一個單獨的類,其他的咖啡,比如牛奶咖啡,甜味咖啡,我們只對材料單獨包裝成一個類。

經過改良的設計:

詳解

1》對於飲品,我們直接繼承Beverage類,直接把報價寫進飲品類裡面;

2》而對於一些需要新增調味品的特殊飲品,我們做累加操作。比如,我想要杯奶咖啡,則 總價=咖啡價+奶價

3》這樣不同的飲料就很容易知道它的價格。

程式碼  
<?php abstract class Beverage{ public $_name; abstract public function Cost(); } // 被裝飾者類 class Coffee extends Beverage{
public function __construct(){ $this->_name = 'Coffee'; }   public function Cost(){ return 1.00; }   } // 以下三個類是裝飾者相關類 class CondimentDecorator extends Beverage{ public function __construct(){ $this->_name = 'Condiment'; }   public function Cost(){
return 0.1; }   } class Milk extends CondimentDecorator{ public $_beverage; public function __construct($beverage){ $this->_name = 'Milk'; if($beverage instanceof Beverage){ $this->_beverage = $beverage

相關推薦

PHP設計模式裝飾模式

介紹 裝飾者模式動態地將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。 思維導圖 有這樣一個專案,做一個餐廳訂餐系統。起初的程式碼結構是這樣的。前面有很多Beverage的繼承類,現在遇到的問題是牛奶的價錢上漲了,那麼所有相關的類,我們都要進行調整

設計模式裝飾模式

一點 ron 測試類 實現類 stub generated class void nbsp 一.裝飾者模式特點:1.裝飾者和被裝飾者對象有相同的超類2.可以用一個或多個裝飾者包裝一個對象3.由於裝飾者和被裝飾者具有相同超類,所以任何需要被包裝對象的場合,可以用裝飾過的對象代

JDK設計模式——裝飾模式(適配器模式)

div rgs static eight 裝飾者 參數 decorator 裝飾器 方式 假定已經有三個類A,B和C他們的繼承關系如下                      ClassA Class B extends A Class C

java的23種設計模式裝飾模式

這裡給大家推薦一篇文章裡面介紹了23種設計模式https://www.aliyun.com/jiaocheng/811770.html; 下面則是我學習裝飾者的見解: 關於裝飾者模式運用的地方其實有很多,我第一次接觸到就是io流中,比如像這樣的: new InputStreamRea

設計模式 - 裝飾模式

一、什麼是裝飾者模式 裝飾著模式:簡單的一句話理解就是,動態的給一個物件新增一些額外的功能,裝飾者模式相對於生成子類更加的靈活。 我們來看下裝飾者模式的UML圖: 二、裝飾者模式的構成 Component(抽象構件):它是裝飾類和具體構件的公共父類;

Java 設計模式裝飾模式

本文為筆者學習《Head First設計模式》的筆記,並加入筆者自己的理解和歸納總結 裝飾者模式動態地將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。 結構圖 雞尾酒Cocktail一般以伏特加(Vodka)、威士忌(Whisky)等烈酒或是葡萄

22、設計模式裝飾模式

抽象商品類 /** * 商品 */ public abstract class AbstractGoods { public abstract String getName() ; public abstract Double getPrice();

ES6設計模式裝飾模式

就是不修改原來的物件的情況下,對物件的功能進行擴充的一種方法。遵循的是開放封閉原則,類可以擴充但是不可以修改。 各種粥裡面有不同的調料,不同的調料可以加不同的量,最後粥的價錢不等。下面是es實現: // 注意粥裡面可以加入不同的調料,調料不一樣價錢不一樣。 class Porridge{ constru

設計模式裝飾模式大概思想

什麼是裝飾者模式呢,為什麼要用裝飾者模式,用了會有什麼好處呢? 那麼下來我給大家介紹一下什麼是裝飾者模式: 裝飾者模式見名知意就是給前面寫的東西裝飾一下,讓它變成對我們最有用的一方面,在面向介面程式設計中有很廣泛的應用。 官方的話是這樣講的:裝飾模式指的是在不必改變原類檔案和使用繼承的情

Android設計模式裝飾模式(Decorator Pattern)

概論 在Android原始碼裡很多時候會看到這個模式。下面來講一些這個模式。 裝飾者模式主要的優點是動態給一個物件新增一些額外的職責。使用Decorator模式相比用生成子類方式達到功能的擴充顯得更為靈活。缺點是,要建立比繼承更多的物件。 先來個熱身,

Java設計模式裝飾模式

一、概念       裝飾者模式:動態的將責任附加到物件上,若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。        關係圖: 說明: 裝飾者和被裝飾者物件有相同的超類你可以擁有一個

每天一個設計模式裝飾模式

什麼是“裝飾者模式” 裝飾者模式:裝飾者模式可以動態地將責任附加到物件上。若要拓展功能,裝飾者模式提供了比繼承更有彈性的替代方案。 在面向物件設計過程中,我們可以遵循一個原則:開閉原則(對拓展開放,對修改關閉) 而裝飾者模式就很好的遵循了這個原則

【知了堂學習筆記】_Java中設計模式裝飾模式的學習

請關注“知了堂學習社群”,地址:http://www.zhiliaotang.com/portal.php 裝飾者模式 一、定義 23種設計模式之一,英文叫Decorator Pattern,又叫裝飾者模式。裝飾模式是在不必改變原類檔案和使用繼承的情況下

設計模式裝飾模式&策略模式&迭代器模式

設計模式之裝飾者模式&策略模式&迭代器模式 Demo地址 裝飾者模式 定義 動態的給一個物件新增額外的功能 應用場景 生活場景,我們給新買的手機裝外殼,外殼可以隨意換 裝飾者模式角色 抽象元件 具體元件

設計模式裝飾模式

定義 動態的將責任附加到物件上。若要擴充套件此功能,裝飾者提供了比繼承更有彈性的替代方案。 類圖 以賣飲料為例 程式碼實現 首先定義了一個抽象的飲料的父類,具有兩個方法,分別是描述資訊和價格 abstract class Drink{

8.java設計模式裝飾模式

#### 基本需求: * 咖啡的種類有很多種,調料也有很多種,下單時,可以點單品咖啡也可以點單品咖啡+調料的組合,並計算下單時花費的金額 #### 傳統方式: * 方式一 * 建立一個抽象類Drink,讓所有的單品咖啡和組合咖啡都繼承Drink類(組合很多) * UML類圖 * ![](

《Head First 設計模式裝飾模式

的人 開放 override ext es2017 必須 想要 ret ted 前言:   時間過得挺快的,轉眼間就到了十月中旬了,再晃著晃著新的一年就要來臨。今天lz有幸來到了浙大圖書館來學習,想想自己已經畢業兩年了,今日再次踏進校園裏,心裏頗有一絲感悟,說不出來,只有把

23種設計模式學習裝飾模式

eth light 裝飾者模式 per int ring ava 功能 接口 裝飾著模式是動態的增強類的功能,要求被裝飾的類必選實現了某個接口 被裝飾類接口 public interface Source { void method1(); } 被裝飾類

PHP 設計模式觀察模式

通知 更新 一對多 改變 變化 variable 它的 all 正常 觀察者模式定義對象的一對多依賴,這樣一來,當一個對象改變狀態時,它的所有依賴者都會收到通知並自動更新! 設計原則 在觀察者模式中,會改變的是主題的狀態以及觀察者的數目。用這個模式,你可以改變

PHP設計模式----觀察模式

subject his font 目標 != php設計模式 ret bst inter 一、概述 1、觀察者模式(Observer),當一個對象的狀態發生改變時,依賴他的對象會全部收到通知,並自動更新。2、場景:一個事件發生後,要執行一連串更新操作.傳統的編程方式,就是在