設計模式之裝飾者模式

2021-09-11 12:04:29 字數 2183 閱讀 9584

##設計模式之裝飾者模式

###需求場景 咖啡店訂單系統

###需求分析 咖啡種模擬較多,結賬的時候我們需要知道咖啡名和**。首先想到的是我們建立乙個咖啡的基類,該類提供乙個**和名稱的介面,店裡的所有的飲料都繼承該類。

####問題

####分析

決定**的因素:

咖啡飲料的** = 咖啡的** + 加入調料的**

由上邊可以看出:

咖啡相當於『被裝飾者』 ,調料相當於』裝飾者『 例如: espresso macchiato(濃縮瑪奇朵 = espresso(濃縮咖啡) +milk(牛奶) + mocha(摩卡)。

espresso 相當於」被裝飾者「 , mocha和milk相當於『裝飾者』

只要對被裝飾者和裝飾者進行不同的組合,就可以得到不同的咖啡

這樣的組合是動態的,被裝飾者和裝飾者不是寫死在類裡的比如繼承,類繼承是在編譯的時候增加行為,而裝飾者模式是在執行時增加行為),而是動態的組合,即在執行時進行繫結

設計結構如下圖:

客點了一杯 espresso macchiato(濃縮瑪奇朵),那麼系統將會開始以下的工作流程:

###**實現

#####beverage.h

#import 

@protocol beverage @optional

-(nsstring *)getname;

-(double)cost;

@end

複製**

#####condimentdecorator.h

#import 

#import "beverage.h"

@protocol condimentdecorator @end

複製**

#####espresso.h

#import 

#import "beverage.h"

@inte***ce espresso : nsobject@end

複製**

#####espresso.m

#import "espresso.h"

@implementation espresso

-(instancetype)init

return self;

}-(nsstring *)getname

-(double)cost

@end

複製**

#####milk.h

#import 

#import "beverage.h"

#import "condimentdecorator.h"

@inte***ce milk : nsobject@property(nonatomic,retain) idbeverage;

-(instancetype)initwithbeverage:(id)beverage;

@end

複製**

#####milk.m

#import "milk.h"

#import "beverage.h"

@implementation milk

-(instancetype)initwithbeverage:(id)beverage

return self;

}-(nsstring *)getname

-(double)cost

@end

複製**

#####mocha同milk ####呼叫

espresso * ex = [[espresso alloc] init];

nslog(@"%@ %.2f",ex.getname,ex.cost);

milk * milk = [[milk alloc] initwithbeverage:ex];

nslog(@"%@ %.2f",milk.getname,milk.cost);

mocha * mocha = [[mocha alloc] initwithbeverage:milk];

nslog(@"%@ %.2f",mocha.getname,mocha.cost);

複製**

設計模式之 裝飾者模式

一 裝飾者模式 裝飾者模式又稱為包裝模式。動態地給乙個物件增加新的職責。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者模式顧名思義就是對乙個物件進行裝飾,具體怎樣裝飾呢?那就是給這個物件不斷的增加職責方法。給乙個物件增加方法不簡單啊,用繼承或者直接在物件的類中增加方法。如果我們要對自...

設計模式之裝飾者模式

此模式動態將職責附加到物件上,若要擴充套件功能,裝飾者提供了比繼承更具彈性的代替方案,以一圖一概括。要點1 裝飾者和被裝飾物件有相同的超型別。2 可以用乙個或多個裝飾者包裝乙個物件。3 裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。4 物件可以在任何時候被裝飾,所以可...

設計模式之裝飾者模式

public abstract class beverage 返回當前飲品的 public abstract double cost 為了讓condiment decorator 調料裝飾者 能夠取代beverage,所以將它擴充套件至beverage類 public abstract class ...