23種設(shè)計模式(二)

版本記錄

版本號 時間
V1.0 2017.04.24

前言

前面我們說了23種設(shè)計模式中的第一種玖瘸,下面我們接著來說剩下的那些僻澎。23種設(shè)計模式有哪些不懂的可以點擊下面鏈接。
??23種設(shè)計模式(一)

詳述

二泌辫、裝飾模式——Decorator

??所謂的裝飾模式勇劣,指的是動態(tài)的給一個對象添加有一些額外的職責(zé)靖避,就增加功能來說潭枣,裝飾模式比生成子類更為靈活。

先看一下下面這個圖片幻捏,這個圖片可以說明一定的原理盆犁。

裝飾模式

我們看一下例子的代碼組織結(jié)構(gòu)。

裝飾模式

下面就直接上代碼了篡九。


1. ViewController.m

#import "ViewController.h"
#import "HCDstractCellPhone.h"
#import "HCDnokiaPhone.h"
#import "HCDdecoratorGPS.h"
#import "HCDdecoratorBluetooth.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    /*
     說明:
     HCDstractCellPhone對應(yīng)圖片中的Component
     HCDnokiaPhone對應(yīng)圖片中的ConcreteComponent
     HCDdecorator對應(yīng)圖片中的Decorator
     HCDdecoratorGPS對應(yīng)圖片中的ConcreteDecoratorA
     HCDdecoratorBluetooth對應(yīng)圖片中的ConcreteDecoratorB
     */
    //核心思想就是通過HCDdecorator各種子類來為HCDnokiaPhone添加各種功能谐岁。而不需要改變HCDnokiaPhone。
    //參考地址:http://www.tuicool.com/articles/jyeU3mu
    HCDstractCellPhone *phone = [[HCDnokiaPhone alloc]init];
    NSLog(@"%@",phone.callNumber);
    NSLog(@"%@",phone.sendMessage);
    
    HCDdecoratorGPS *GPS = [[HCDdecoratorGPS alloc]init];
    [GPS setComponents:phone];
    NSLog(@"%@",GPS.callNumber);
    NSLog(@"%@",GPS.sendMessage);
    
    HCDdecoratorBluetooth *bluetooth = [[HCDdecoratorBluetooth alloc] init];
    [bluetooth setComponents:phone];
    NSLog(@"%@",bluetooth.callNumber);
    NSLog(@"%@",bluetooth.sendMessage);
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

@end

2. HCDstractCellPhone.h

#import <Foundation/Foundation.h>

@interface HCDstractCellPhone : NSObject

- (NSString *)callNumber;

- (NSString *)sendMessage;

@end


3. HCDstractCellPhone.m

#import "HCDstractCellPhone.h"

@implementation HCDstractCellPhone

- (NSString *)callNumber
{
    return @"phone call someBody";
}

- (NSString *)sendMessage
{
    return @"phone send a message to somebody";
}

@end


4. HCDnokiaPhone.h

#import "HCDstractCellPhone.h"

@interface HCDnokiaPhone : HCDstractCellPhone

@end


5. HCDnokiaPhone.m

#import "HCDnokiaPhone.h"

@implementation HCDnokiaPhone

- (NSString *)callNumber
{
    return @"Nokiaphone call somebody";
}

- (NSString *)sendMessage
{
    return @"NokiaPhone send message to somebody";
}

@end

6. HCDdecorator.h

#import "HCDstractCellPhone.h"

@interface HCDdecorator : HCDstractCellPhone

@property (nonatomic,strong) HCDstractCellPhone *abstractCellPhone;

- (void)setComponents:(HCDstractCellPhone *)component;

@end


7. HCDdecorator.m

#import "HCDdecorator.h"

@implementation HCDdecorator

- (void)setComponents:(HCDstractCellPhone *)component
{
    self.abstractCellPhone = component;
}

- (NSString *)callNumber
{
    return [self.abstractCellPhone callNumber];
}

- (NSString *)sendMessage
{
    return self.abstractCellPhone.sendMessage;
}

@end

8. HCDdecoratorGPS.h

#import "HCDdecorator.h"

@interface HCDdecoratorGPS : HCDdecorator

@end



9. HCDdecoratorGPS.m
#import "HCDdecoratorGPS.h"

@implementation HCDdecoratorGPS

- (NSString *)callNumber
{
    return [NSString stringWithFormat:@"%@ with GPS", [super callNumber]];
}

- (NSString *)sendMessage
{
    return [NSString stringWithFormat:@"%@ with GPS", [super sendMessage]];
}

@end
10. HCDdecoratorBluetooth.h
#import "HCDdecorator.h"

@interface HCDdecoratorBluetooth : HCDdecorator

@end


11. HCDdecoratorBluetooth.m
#import "HCDdecoratorBluetooth.h"

@implementation HCDdecoratorBluetooth

- (NSString *)callNumber
{
    return [NSString stringWithFormat:@"%@ with bluetooth", [super callNumber]];
}

- (NSString *)sendMessage
{
    return [NSString stringWithFormat:@"%@ with bluetooth", [super sendMessage]];
}

@end

下面看一下輸出結(jié)果榛臼。

2017-04-24 23:15:30.341 3裝飾模式[1264:37553] Nokiaphone call somebody
2017-04-24 23:15:30.343 3裝飾模式[1264:37553] NokiaPhone send message to somebody
2017-04-24 23:15:30.344 3裝飾模式[1264:37553] Nokiaphone call somebody with GPS
2017-04-24 23:15:30.345 3裝飾模式[1264:37553] NokiaPhone send message to somebody with GPS
2017-04-24 23:15:30.345 3裝飾模式[1264:37553] Nokiaphone call somebody with bluetooth
2017-04-24 23:15:30.347 3裝飾模式[1264:37553] NokiaPhone send message to somebody with bluetooth

結(jié)論:代碼沒什么難度伊佃,主要是學(xué)習(xí)這種模式和設(shè)計思想。


三沛善、代理模式——Proxy

??主要就是為其他對象提供一種代理以控制對這個對象的訪問航揉。

先看代碼組織結(jié)構(gòu)。

代理模式

直接看代碼金刁。

1. ViewController.m

#import "ViewController.h"
#import "HCDpursuit.h"
#import "HCDproxy.h"
#import "HCDschoolGirl.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    HCDschoolGirl *girl = [[HCDschoolGirl alloc]init];
    girl.name = @"哈哈哈哈哈";
    HCDproxy *proxy = [[HCDproxy alloc]initWithSchoolGirl:girl];
    [proxy giveFlowers];
    [proxy giveDolls];
    [proxy giveChocolate];
    
}

@end

2. HCDgiveGift.h
#import <Foundation/Foundation.h>

@protocol HCDgiveGift <NSObject>

///  送洋娃娃
- (void)giveDolls;

///  送鮮花
- (void)giveFlowers;

///  送巧克力
- (void)giveChocolate;

@end
3. HCDpursuit.h

#import <Foundation/Foundation.h>
#import "HCDgiveGift.h"

@class HCDschoolGirl;

@interface HCDpursuit : NSObject<HCDgiveGift>

- (instancetype)initWithSchoolGirl:(HCDschoolGirl *)schoolGirl;

@end
4. HCDpursuit.m
#import "HCDpursuit.h"
#import "HCDschoolGirl.h"

@interface HCDpursuit ()

@property (nonatomic, strong) HCDschoolGirl *schoolGirl;

@end

@implementation HCDpursuit

- (instancetype)initWithSchoolGirl:(HCDschoolGirl *)schoolGirl{
    self = [super init];
    if (self) {
        _schoolGirl = schoolGirl;
    }
    return self;
}

- (void)giveChocolate
{
    NSLog(@"送你巧克力%@",self.schoolGirl.name);
}

- (void)giveDolls
{
    NSLog(@"送你洋娃娃%@",self.schoolGirl.name);
}

- (void)giveFlowers
{
    NSLog(@"送你玫瑰花%@",self.schoolGirl.name);
}

@end

5. HCDproxy.h
#import <Foundation/Foundation.h>
#import "HCDgiveGift.h"

@class HCDschoolGirl,HCDpursuit;

@interface HCDproxy : NSObject <HCDgiveGift>

- (instancetype)initWithSchoolGirl:(HCDschoolGirl *)schoolGirl;

@end
6. HCDproxy.m
#import "HCDproxy.h"
#import "HCDschoolGirl.h"
#import "HCDpursuit.h"

@interface HCDproxy ()

@property (strong, nonatomic) HCDpursuit *pursuit;

@end

@implementation HCDproxy

- (instancetype)initWithSchoolGirl:(HCDschoolGirl *)schoolGirl {
    self = [super init];
    if (self) {
        self.pursuit = [[HCDpursuit alloc] initWithSchoolGirl:schoolGirl];
    }
    return self;
}

- (void)giveDolls
{
    [self.pursuit giveDolls];
}

- (void)giveFlowers
{
    [self.pursuit giveFlowers];
}

- (void)giveChocolate
{
    [self.pursuit giveChocolate];
}

@end
7. HCDschoolGirl.h
#import <Foundation/Foundation.h>

@interface HCDschoolGirl : NSObject

@property (nonatomic, strong) NSString *name;

@end

8. HCDschoolGirl.m

#import "HCDschoolGirl.h"

@implementation HCDschoolGirl

@end

看結(jié)果

2017-04-24 23:53:43.740 4代理模式[1815:64420] 送你玫瑰花哈哈哈哈哈
2017-04-24 23:53:43.741 4代理模式[1815:64420] 送你洋娃娃哈哈哈哈哈
2017-04-24 23:53:43.741 4代理模式[1815:64420] 送你巧克力哈哈哈哈哈

結(jié)論:代碼簡單帅涂,想法重要。

后記

??今天就說這兩種設(shè)計模式尤蛮,其他的待續(xù)媳友,謝謝大家的支持。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末产捞,一起剝皮案震驚了整個濱河市醇锚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坯临,老刑警劉巖焊唬,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異尿扯,居然都是意外死亡求晶,警方通過查閱死者的電腦和手機焰雕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門衷笋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人矩屁,你說我怎么就攤上這事辟宗。” “怎么了吝秕?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵泊脐,是天一觀的道長。 經(jīng)常有香客問我烁峭,道長容客,這世上最難降的妖魔是什么秕铛? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮缩挑,結(jié)果婚禮上但两,老公的妹妹穿的比我還像新娘。我一直安慰自己供置,他們只是感情好谨湘,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著芥丧,像睡著了一般紧阔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上续担,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天擅耽,我揣著相機與錄音,去河邊找鬼物遇。 笑死秫筏,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挎挖。 我是一名探鬼主播这敬,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蕉朵!你這毒婦竟也來了崔涂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤始衅,失蹤者是張志新(化名)和其女友劉穎冷蚂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汛闸,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡蝙茶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了诸老。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隆夯。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖别伏,靈堂內(nèi)的尸體忽然破棺而出蹄衷,到底是詐尸還是另有隱情,我是刑警寧澤厘肮,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布愧口,位于F島的核電站,受9級特大地震影響类茂,放射性物質(zhì)發(fā)生泄漏耍属。R本人自食惡果不足惜托嚣,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望厚骗。 院中可真熱鬧注益,春花似錦、人聲如沸溯捆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽提揍。三九已至啤月,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間劳跃,已是汗流浹背谎仲。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刨仑,地道東北人郑诺。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像杉武,于是被迫代替她去往敵國和親辙诞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容