23種設計模式(十一)

版本記錄

版本號 時間
V1.0 2017.04.29

前言

前面講了23種設計模式中的前幾個,下面我們繼續(xù)试读,先看前幾篇文章杠纵。
1. 23種設計模式(一)
2. 23種設計模式(二)
3. 23種設計模式(三)
4. 23種設計模式(四)
5. 23種設計模式(五)
6. 23種設計模式(六)
7. 23種設計模式(七)
8. 23種設計模式(八)
9. 23種設計模式(九)
10. 23種設計模式(十)

詳述

二十一、享元模式——Flyweight

??使用共享技術有效地支持大量細粒度的對象钩骇。先看一下原理圖比藻。

享元模式原理圖

下面看一下代碼組織結構。

享元模式代碼結構圖

看代碼倘屹。

1. ViewController.m

#import "ViewController.h"
#import "HCDWebSiteFactory.h"
#import "HCDWebSite.h"
#import "HCDConcreteWebSite.h"
#import "HCDUser.h"

typedef id<HCDWebSite> HCDWebSiteType;

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    HCDWebSiteFactory *facoty = [[HCDWebSiteFactory alloc]init];
    HCDWebSiteType fx = [facoty getWebSiteCategory:@"產品展示"];
    HCDUser *user = [[HCDUser alloc]init];
    user.name = @"小菜";
    [fx use:user];
    HCDWebSiteType fy = [facoty getWebSiteCategory:@"產品展示"];
    HCDUser *user1 = [[HCDUser alloc]init];
    user1.name = @"大鳥";
    [fy use:user1];
    HCDWebSiteType fz = [facoty getWebSiteCategory:@"博客"];
    HCDUser *user2 = [[HCDUser alloc]init];
    user2.name = @"咪咪";
    [fz use:user2];
    
    NSInteger count = [facoty getWebSiteCount];
    NSLog(@"個數(shù):%ld",count);
}

@end


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

@interface HCDUser : NSObject

@property (nonatomic, strong) NSString *name;

@end


3. HCDUser.m

#import "HCDUser.h"

@implementation HCDUser

@end

4. HCDWebSite.h

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

@protocol HCDWebSite <NSObject>

- (void)use:(HCDUser *)user;

@end


5. HCDConcreteWebSite.h
#import <Foundation/Foundation.h>
#import "HCDWebSite.h"

@interface HCDConcreteWebSite : NSObject <HCDWebSite>

@property (nonatomic, strong) NSString *webName;

@end


6. HCDConcreteWebSite.m

#import "HCDConcreteWebSite.h"

@implementation HCDConcreteWebSite

- (void)use:(HCDUser *)user
{
    NSLog(@"網(wǎng)站分類:%@,用戶:%@",self.webName,user.name);
}

@end


7. HCDWebSiteFactory.h

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

@interface HCDWebSiteFactory : NSObject

@property (nonatomic, strong) NSDictionary *flyweights;

- (id<HCDWebSite> )getWebSiteCategory:(NSString *)webkey;

- (NSInteger)getWebSiteCount;

@end



8. HCDWebSiteFactory.m
#import "HCDWebSiteFactory.h"
#import "HCDConcreteWebSite.h"

@implementation HCDWebSiteFactory

- (instancetype)init
{
    self = [super init];
    if (self) {
        _flyweights = [NSDictionary dictionary];
    }
    return self;
}

- (id<HCDWebSite> )getWebSiteCategory:(NSString *)webkey
{
    __block id<HCDWebSite> webset = nil;
    [self.flyweights enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        if (webkey == key) {
            webset = obj;
            *stop = YES;
        }
    }];
    if (webset == nil) {
        HCDConcreteWebSite  *concreteset = [[HCDConcreteWebSite alloc] init];
        concreteset.webName = webkey;
        webset = concreteset;
        
        NSMutableDictionary *mutabledic = [NSMutableDictionary dictionaryWithDictionary:self.flyweights];
        [mutabledic setObject:webset forKey:webkey];
        self.flyweights = [NSDictionary dictionaryWithDictionary:mutabledic];
    }
    return webset;
}

- (NSInteger)getWebSiteCount
{
    return self.flyweights.count;
}
 
@end

看結果银亲。

2017-04-29 15:34:54.942 21享元模式[2818:103728] 網(wǎng)站分類:產品展示,用戶:小菜
2017-04-29 15:34:54.942 21享元模式[2818:103728] 網(wǎng)站分類:產品展示,用戶:大鳥
2017-04-29 15:34:54.943 21享元模式[2818:103728] 網(wǎng)站分類:博客,用戶:咪咪
2017-04-29 15:34:54.943 21享元模式[2818:103728] 個數(shù):2

結論:注重思想。


二十二纽匙、解釋器模式——Interpreter

??給定一個語言务蝠,定義它的文法的一種表示,并定義一個解釋器烛缔,這個解釋器使用該表示中解釋語言匯中的句子馏段。

下面看一下代碼組織結構。

代碼組織結構

下面看代碼践瓷。

1. ViewController.m

#import "ViewController.h"
#import "HCDContext.h"
#import "HCDTerminalExpression.h"
#import "HCDNonterminalExpression.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    HCDContext *context = [[HCDContext alloc]initWithInput:@"12345"];
    NSMutableArray *list = [[NSMutableArray alloc]init];
    
    [list addObject:[[HCDTerminalExpression alloc]init]];
    
    [list addObject:[[HCDNonterminalExpression alloc]init]];
    
    [list addObject:[[HCDTerminalExpression alloc]init]];
    
    [list addObject:[[HCDTerminalExpression alloc]init]];
    
    for(HCDAbstractExpression *exp in list) {
        [exp interpret:context];
    }
    
}

@end

2. HCDContext.h

#import <Foundation/Foundation.h>

@interface HCDContext : NSObject

- (instancetype)initWithInput:(NSString *)input;

@property (nonatomic, copy) NSString *input;
@property (nonatomic, copy) NSString *output;

@end


3. HCDContext.m

#import "HCDContext.h"

@implementation HCDContext

- (instancetype)initWithInput:(NSString *)input
{
    self = [super init];
    if (self) {
        _input = input;
    }
    return self;
}

- (NSString *)output
{
    return [NSString stringWithFormat:@"輸入的是%@",_input];
}

@end


4. HCDAbstractExpression.h
#import <Foundation/Foundation.h>
#import "HCDContext.h"

@interface HCDAbstractExpression : NSObject

- (void)interpret:(HCDContext *)context;

@end


5. HCDAbstractExpression.m
#import "HCDAbstractExpression.h"

@implementation HCDAbstractExpression

- (void)interpret:(HCDContext *)context
{
    return;
}

@end


6. HCDTerminalExpression.h

#import "HCDAbstractExpression.h"

@interface HCDTerminalExpression : HCDAbstractExpression

@end

7. HCDTerminalExpression.m

#import "HCDTerminalExpression.h"

@implementation HCDTerminalExpression

- (void)interpret:(HCDContext *)context
{
    NSLog(@"終端解釋器,context == %@",context.output);
}

@end


8. HCDNonterminalExpression.h

#import "HCDAbstractExpression.h"

@interface HCDNonterminalExpression : HCDAbstractExpression

@end

9. HCDNonterminalExpression.m

#import "HCDNonterminalExpression.h"

@implementation HCDNonterminalExpression

- (void)interpret:(HCDContext *)context
{
    NSLog(@"非終端解釋器,context == %@",context.output);
}

@end

看結果院喜。

2017-04-29 15:49:05.226 22解釋器模式[3116:115594] 終端解釋器,context == 輸入的是12345
2017-04-29 15:49:05.228 22解釋器模式[3116:115594] 非終端解釋器,context == 輸入的是12345
2017-04-29 15:49:05.228 22解釋器模式[3116:115594] 終端解釋器,context == 輸入的是12345
2017-04-29 15:49:05.229 22解釋器模式[3116:115594] 終端解釋器,context == 輸入的是12345

結論:思想。


二十三晕翠、訪問者模式——Visitor

??表示一個作用于某對象結構中的各元素的操作喷舀,它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。先看一下代碼組織結構崖面。

代碼結構

下面看代碼元咙。


1. ViewController.m

#import "ViewController.h"
#import "HCDObjectStructure.h"
#import "HCDConcreteElementB.h"
#import "HCDConcreteElementA.h"
#import "HCDConcreteVisitor1.h"
#import "HCDConcreteVisitor2.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    HCDObjectStructure *o = [[HCDObjectStructure alloc]init];
    
    HCDConcreteElementA *eA = [HCDConcreteElementA new];
    
    HCDConcreteElementB *eB = [HCDConcreteElementB new];
    
    [o attach:eA];
    
    [o attach:eB];
    
    HCDConcreteVisitor1
    *v1 = [HCDConcreteVisitor1 new];
    
    HCDConcreteVisitor2
    *v2 = [HCDConcreteVisitor2 new];
    
    [o accept: v1];
    
    [o accept: v2];
}

@end

2. HCDVisitors.h

#import <Foundation/Foundation.h>

@class HCDConcreteElementA,HCDConcreteElementB;

@interface HCDVisitors : NSObject

- (void)VisitConcreteElementA:(HCDConcreteElementA *)concreteElementA;

- (void)VisitConcreteElementB:(HCDConcreteElementB *)concreteElementB;

@end


3. HCDVisitors.m

#import "HCDVisitors.h"
#import "HCDConcreteElementA.h"
#import "HCDConcreteElementB.h"

@implementation HCDVisitors

- (void)VisitConcreteElementA:(HCDConcreteElementA *)concreteElementA
{
    return;
}

- (void)VisitConcreteElementB:(HCDConcreteElementB *)concreteElementB
{
    return;
}

@end

4. HCDConcreteVisitor1.h

#import "HCDVisitors.h"

@interface HCDConcreteVisitor1 : HCDVisitors

@end



5. HCDConcreteVisitor1.m
#import "HCDConcreteVisitor1.h"
#import "HCDConcreteElementA.h"

@implementation HCDConcreteVisitor1

- (void)VisitConcreteElementA:(HCDConcreteElementA *)concreteElementA
{
    NSString *eleName = NSStringFromClass([concreteElementA class]);
    
    NSString *visitorName = NSStringFromClass([self class]);
    
    NSLog(@"%@被%@訪問",eleName, visitorName);
}

@end

6. HCDConcreteVisitor2.h
#import "HCDVisitors.h"

@interface HCDConcreteVisitor2 : HCDVisitors

@end

7. HCDConcreteVisitor2.m

#import "HCDConcreteVisitor2.h"
#import "HCDConcreteElementB.h"

@implementation HCDConcreteVisitor2

- (void)VisitConcreteElementB:(HCDConcreteElementB *)concreteElementB
{
    NSString *eleName = NSStringFromClass([concreteElementB class]);
    
    NSString *visitorName = NSStringFromClass([self class]);
    
    NSLog(@"%@被%@訪問",eleName, visitorName);
}

@end


8. HCDElements.h
#import <Foundation/Foundation.h>

@class HCDVisitors;

@interface HCDElements : NSObject

- (void)accept:(HCDVisitors *)visitor;

@end


9. HCDElements.m
#import "HCDElements.h"

@implementation HCDElements

- (void)accept:(HCDVisitors *)visitor
{
    return;
}

@end

10. HCDConcreteElementA.h

#import "HCDElements.h"

@interface HCDConcreteElementA : HCDElements

- (void)operationA;

@end

11. HCDConcreteElementA.m

#import "HCDConcreteElementA.h"
#import "HCDVisitors.h"

@implementation HCDConcreteElementA

- (void)operationA
{
    return;
}

- (void)accept:(HCDVisitors *)visitor
{
    [visitor VisitConcreteElementA:self];
}

@end


12. HCDConcreteElementB.h
#import "HCDElements.h"

@interface HCDConcreteElementB : HCDElements

- (void)operationB;

@end


13. HCDConcreteElementB.m

#import "HCDConcreteElementB.h"
#import "HCDVisitors.h"

@implementation HCDConcreteElementB

- (void)operationB
{
    return;
}

- (void)accept:(HCDVisitors *)visitor
{
    [visitor VisitConcreteElementB:self];
}

@end


14. HCDObjectStructure.h
#import <Foundation/Foundation.h>

@class HCDElements;
@class HCDVisitors;

@interface HCDObjectStructure : NSObject

{
    NSMutableArray *elements;
}

- (void)attach:(HCDElements *)element;
- (void)detach:(HCDElements *)element;
- (void)accept:(HCDVisitors *)visitor;

@end

15. HCDObjectStructure.m

#import "HCDObjectStructure.h"
#import "HCDElements.h"
#import "HCDVisitors.h"

@implementation HCDObjectStructure

- (instancetype)init
{
    self = [super init];
    if (self) {
        elements = [[NSMutableArray alloc]init];
    }
    return self;
}

- (void)attach:(HCDElements *)element
{
    [elements addObject:element];
}

- (void)detach:(HCDElements *)element
{
    [elements removeObject:element];
}

- (void)accept:(HCDVisitors *)visitor
{
    for (HCDElements *e in elements) {
        [e accept:visitor];
    }
}

@end

看結果。

2017-04-29 16:43:15.989 23訪問者模式[3771:148226] HCDConcreteElementA被HCDConcreteVisitor1訪問
2017-04-29 16:43:15.990 23訪問者模式[3771:148226] HCDConcreteElementB被HCDConcreteVisitor2訪問


結論:注意思想巫员。

后記

?? 23種設計模式庶香,寫了好幾天,今天總算完事了简识,祝自己五一快樂吧赶掖,今天過得還算有意義感猛,喜歡我寫的就點個贊吧,謝謝大家奢赂。再次祝大家五一快樂哦E惆住!I旁睢咱士!

大海
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市轧钓,隨后出現(xiàn)的幾起案子序厉,更是在濱河造成了極大的恐慌,老刑警劉巖毕箍,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弛房,死亡現(xiàn)場離奇詭異,居然都是意外死亡而柑,警方通過查閱死者的電腦和手機文捶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來媒咳,“玉大人粹排,你說我怎么就攤上這事∥昂” “怎么了恨搓?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長筏养。 經(jīng)常有香客問我,道長常拓,這世上最難降的妖魔是什么渐溶? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮弄抬,結果婚禮上茎辐,老公的妹妹穿的比我還像新娘。我一直安慰自己掂恕,他們只是感情好拖陆,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著懊亡,像睡著了一般依啰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上店枣,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天速警,我揣著相機與錄音叹誉,去河邊找鬼。 笑死闷旧,一個胖子當著我的面吹牛长豁,可吹牛的內容都是我干的。 我是一名探鬼主播忙灼,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼匠襟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了该园?” 一聲冷哼從身側響起宅此,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎爬范,沒想到半個月后父腕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡青瀑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年璧亮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斥难。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡枝嘶,死狀恐怖,靈堂內的尸體忽然破棺而出哑诊,到底是詐尸還是另有隱情群扶,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布镀裤,位于F島的核電站竞阐,受9級特大地震影響,放射性物質發(fā)生泄漏暑劝。R本人自食惡果不足惜骆莹,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望担猛。 院中可真熱鬧幕垦,春花似錦、人聲如沸傅联。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒸走。三九已至仇奶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間载碌,已是汗流浹背猜嘱。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工衅枫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人朗伶。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓弦撩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親论皆。 傳聞我的和親對象是個殘疾皇子益楼,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容