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] 送你巧克力哈哈哈哈哈
结论:代码简单,想法重要。
后记
今天就说这两种设计模式,其他的待续,谢谢大家的支持。