iOS開發 裝飾模式

2021-09-07 04:52:07 字數 2445 閱讀 8464

裝飾模式是指在不必改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。裝飾模式中的

裝飾物件和真實物件有相同的介面。這樣客戶端物件就能以和真實物件相同的方式和裝飾物件互動,同時裝飾物件包含乙個真實物件的引用(reference),

裝飾物件接受所有來自客戶端的請求。它把這些請求**給真實的物件。 裝飾

模式與繼承都可以要擴充套件物件的功能,但是裝飾模式可以提供比繼承更多的靈活性。 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創造出很多不同行為的組合。

單純的看概念有點單調,看一張經典的裝飾模式的uml類圖:

component定義concretecomponent和decorator類要實現的方法,裝飾物件和真實物件的之間的通訊就是通過component實現;

concretecomponent真實物件,使用concretecomponent的派生類提供核心功能,與decorator是同一級別;

decorator具有特定裝飾功能的類,用來裝飾concretecomponent類,具體的裝飾子類通過繼承decorator實現;

關於整體的輪廓有了乙個大概的了解,我們可以通過生活的例子來模擬裝飾模式,關於房子,有商業住宅和民用住宅,買了房子我們需要裝修,桌子,椅子必不可少,我們最終需要算一下總費用,思考幾秒可以看下面具體實現;

設計基礎類house和協議:

@protocol housedelegate @optional

-(double)totalmoney;

@end

@inte***ce house : nsobject-(nsstring *)detialinfo;

@end

house的子類commercialhouse,被裝飾物件:

@implementation commercialhouse

-(double)totalmoney

-(nsstring *)detialinfo

@end

裝飾物件的基類housedecorator,這裡需要保持乙個對被裝飾物件的引用:

@inte***ce housedecorator : house

-(instancetype)initwithhouse:(house *)house;

@property (strong,nonatomic) house *house;

@end

@implementation housedecorator

-(instancetype)initwithhouse:(house *)house

return self;

}@end

裝飾物件

tabledecorator:

@implementation tabledecorator

-(double)totalmoney

-(nsstring *)detialinfo

@end

裝飾物件chairdecorator:

@implementation chairdecorator

-(double)totalmoney

-(nsstring *)detialinfo

@end

回到最初的總費用問題,我們看下結果:

house  *house=[[commercialhouse alloc]init];

house=[[tabledecorator alloc]initwithhouse:house];

house=[[chairdecorator alloc]initwithhouse:house];

nslog(@"房子**:%f", [house totalmoney]);

nslog(@"房子詳情:%@",[house detialinfo]);

桌子椅子的**是可以動態變化的,桌子椅子的數量的也是不確定的,從這些角度看例子稍微有點勉強,不過大概功能設計實現大同小異,萬變不離其宗,相信大家會對裝飾模式有自己獨到的見解~

ios設計模式 裝飾模式 decorator

適用場景,對不可修改的類進行擴充套件,比如說靜態庫 或系統的類等 使用思路 1.先模擬出乙個被裝飾 類 功能一樣的類 2.建立 模擬類 的子類,對子類進行擴充套件。原物件 import inte ce gamepad nsobject 上下左右操作 void up void down void le...

iOS裝飾模式的實現

首先需要乙個需要裝飾的類object inte ce object nsobject void doonething void dootherthing end implementation object void doonething void dootherthing end 然後需要類obje...

移動開發設計模式之裝飾模式解析

移動開發設計模式之裝飾模式解析,動態的給乙個物件新增一些額外的職責,就增加功能而言,裝飾模式比生成子類更靈活 public abstract class human 具體實現類,被修飾物件,小白 public class xiaobai extends human 裝飾父類,需要只需要修飾一次,那麼...