23种设计模式(二)

版本记录

版本号 时间
V1.0 2017.04.24

前言

前面我们说了23种设计模式中的第一种,下面我们接着来说剩下的那些。23种设计模式有哪些不懂的可以点击下面链接。
  23种设计模式(一)

详述

二、装饰模式——Decorator

  所谓的装饰模式,指的是动态的给一个对象添加有一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

先看一下下面这个图片,这个图片可以说明一定的原理。

装饰模式

我们看一下例子的代码组织结构。

装饰模式

下面就直接上代码了。


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对应图片中的Component
     HCDnokiaPhone对应图片中的ConcreteComponent
     HCDdecorator对应图片中的Decorator
     HCDdecoratorGPS对应图片中的ConcreteDecoratorA
     HCDdecoratorBluetooth对应图片中的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

下面看一下输出结果。

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

结论:代码没什么难度,主要是学习这种模式和设计思想。


三、代理模式——Proxy

  主要就是为其他对象提供一种代理以控制对这个对象的访问。

先看代码组织结构。

代理模式

直接看代码。

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

看结果

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] 送你巧克力哈哈哈哈哈

结论:代码简单,想法重要。

后记

  今天就说这两种设计模式,其他的待续,谢谢大家的支持。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容