版本記錄
版本號 | 時間 |
---|---|
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ù)媳友,謝謝大家的支持。