23种设计模式

23种设计模式(二)

2017-04-25  本文已影响89人  刀客传奇

版本记录

版本号 时间
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] 送你巧克力哈哈哈哈哈

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

后记

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

上一篇下一篇

猜你喜欢

热点阅读