亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

實例講解iOS應用的設計模式開發中的Visitor訪問者模式

2020-02-19 15:46:53
字體:
來源:轉載
供稿:網友

程序員在現實生活中,一些集合對象中有許多不同的元素,每個元素也有許多不同的訪問者和處理方法,別著急,今天武林技術頻道為大家實例講解iOS應用的設計模式開發中的Visitor訪問者模式。

為了方便向大家展示,先給出簡短的定義:

訪問者模式(Visitor),表示一個作用于某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。

緊接著,給出其類結構圖。

201632293447218.jpg (500×385)
訪問者模式適用于數據結構相對穩定的系統,它把數據結構和作用于結構上的操作之間的耦合解脫開,使得操作結合可以相對自由地演化。

訪問者模式的目的是要把處理從數據結構分離出來。很多系統可以按照算法和數據結構分開,如果這樣的系統有比較穩定的數據結構,又有易于變化的算法的話,使用訪問者模式就是比較合適的,因為訪問者模式使得算法操作的增加變得容易。

訪問者模式的優點就是增加新的操作很容易,因為增加新的操作就意味著增加一個新的訪問者。訪問者模式將有關的行為集中到一個訪問者對象中。

那其實,訪問者模式的缺點也就是使增加新的數據結構變得苦難了。所以,GoF四人中的一個作者增經說過,‘大多時候你并不需要訪問者模式,但當一旦你需要訪問者模式的時候,那就是真的需要它了'。

那么下面還是老慣例,給大家展示一下簡單的實現。
一個簡單的Car模型,含有1臺Engine、4個Wheel,使用訪問者模式添加對Car的升級與維修操作。

定義Engine類:

?

#import <Foundation/Foundation.h>
#import "NimoComponentVisitor.h"
?
@interface NimoEngine : NSObject
?
@property (nonatomic, copy) NSString *modelName;
- (id)initWithModelName:(NSString *)modelName;
?
@end

?

?

?


#import "NimoEngine.h"
?
@implementation NimoEngine
?
- (id)initWithModelName:(NSString *)modelName
{
??? self = [super init];
??? if (self) {
??????? _modelName = [modelName copy];
??? }
??? return self;
}
?
- (id) init
{
??? return [self initWithModelName:@"Slant 6"];
}
?
- (NSString *)description
{
??? return [NSString stringWithFormat:@"Engine: %@", _modelName];
}
?
@end


定義Wheel類:

?

?

?


#import <Foundation/Foundation.h>
?
@interface NimoWheel : NSObject
?
@property (nonatomic, assign) float diameter; //車輪直徑
?
@end

?

?

?


#import "NimoWheel.h"
?
@implementation NimoWheel
?
- (id)init
{
??? self = [super init];
??? if (self) {
??????? _diameter = 400.0f;
??? }
??? return self;
}
?
-(NSString *)description
{
??? return [NSString stringWithFormat:@"Wheel: %f mm", _diameter];
}
?
@end


定義Car類:

?

?

?


#import <Foundation/Foundation.h>
?
@class NimoEngine, NimoWheel;
?
@interface NimoCar : NSObject
?
@property (nonatomic) NimoEngine *engine;
@property (nonatomic, readonly) NSArray *arrayOfWheels;
?
- (void)addWheel:(NimoWheel *)wheel atIndex:(NSUInteger) index;
?
@end

?

?

?


@interface NimoCar()
?
@property (nonatomic, readwrite) NSMutableArray *mutableArrayOfWheels;
?
@end

?

?

?


@implementation NimoCar
?
- (id)init
{
??? if (self = [super init]) {
??????? _mutableArrayOfWheels = [[NSMutableArray alloc] initWithCapacity:4];
??? }
????
??? return self;
}
?
- (void)addWheel:(NimoWheel *)wheel atIndex:(NSUInteger) index
{
??? [_mutableArrayOfWheels insertObject:wheel atIndex:index];
}
?
- (NSArray *)arrayOfWheels
{
??? return [_mutableArrayOfWheels copy];
}
?
- (NSString *)description
{
??? return [NSString stringWithFormat:@"My car: %@", [NSDictionary dictionaryWithObjects:@[_engine, self.arrayOfWheels] forKeys:@[@"Engine", @"Wheels"]]];
}
?
@end


我們的汽車結構很簡單,只包含1個引擎,4個車輪,并且各個類也沒有復雜的實現,僅僅覆寫了description,讓其輸出簡要的信息。

?

好,實例化一輛Car, 看看效果:

?

#import <Foundation/Foundation.h>
#import "NimoCar.h"
#import "NimoEngine.h"
#import "NimoWheel.h"
?
int main(int argc, const char * argv[]) {
??? @autoreleasepool {
????????
??????? NimoCar *car = [[NimoCar alloc] init];
??????? NimoEngine *engine = [[NimoEngine alloc] initWithBrandName:@"V8"];
??????? NimoWheel *wheelA = [[NimoWheel alloc] init];
??????? NimoWheel *wheelB = [[NimoWheel alloc] init];
??????? NimoWheel *wheelC = [[NimoWheel alloc] init];
??????? NimoWheel *wheelD = [[NimoWheel alloc] init];
????????
??????? car.engine = engine;
??????? [car addWheel:wheelA atIndex:0];
??????? [car addWheel:wheelB atIndex:1];
??????? [car addWheel:wheelC atIndex:2];
??????? [car addWheel:wheelD atIndex:3];
????????
??????? NSLog(@"%@", car);
????????
??? }
??? return 0;
}

?

?

?

201632293536226.png (768×152)

控制臺跟意料中一樣輸出了Car的信息。至此,準備工作做好了。

訪問者模式:表示一個作用于某對象結構中的各元素的操作。它讓我們可以在不改變各元素的類的前提下定義作用于這些元素的新操作。---《設計模式》(Addison-Wesley, 1994)

這段話比較拗口,不太好理解。拿剛剛完成的Car類來舉例,NimoCar類就是對象結構,其中包含的元素為:NimoEngine類和NimoWheel類。如果現在需要對Car進行全面升級(新操作),通常的做法是NimoEngine與NimoWheel都向外提供“升級”的接口。如果還需要對Car進行維修呢?那又得向外提供“維修”的接口。隨著類似的需求越多,NimoEngine與NimoWheel向外提供的接口就越多,類也變得越復雜。有沒有簡單的方法呢?有!把這些瑣事都交給訪問者來做吧,NimoEngine與NimoWheel只要同意被訪問就成。

定義訪問者協議:

?

@class NimoEngine, NimoWheel;
?
@protocol NimoComponentVisitor <NSObject>
?
- (void) visitEngine:(NimoEngine *) engine;
- (void) visitWheel:(NimoWheel *) wheel;
?
@end


修改我們的類,使其能夠接受訪問

?

添加訪問支持的Engine類:

?

#import <Foundation/Foundation.h>
#import "NimoComponentVisitor.h"
?
@interface NimoEngine : NSObject
?
@property (nonatomic, copy) NSString *modelName;
?
- (id)initWithModelName:(NSString *)modelName;
?
- (void)acceptComponentVisitor:(id<NimoComponentVisitor>) visitor;
?
@end

?

?

?


#import "NimoEngine.h"
?
@implementation NimoEngine
?
- (id)initWithModelName:(NSString *)modelName
{
??? self = [super init];
??? if (self) {
??????? _modelName = [modelName copy];
??? }
??? return self;
}
?
- (id) init
{
??? return [self initWithModelName:@"Slant 6"];
}
?
- (void)acceptComponentVisitor:(id<NimoComponentVisitor>) visitor
{
??? [visitor visitEngine:self];
}
?
- (NSString *)description
{
??? return [NSString stringWithFormat:@"Engine: %@", _modelName];
}
?
@end


添加訪問支持的Wheel類:

?

?

?


#import <Foundation/Foundation.h>
#import "NimoComponentVisitor.h"
?
@interface NimoWheel : NSObject
?
@property (nonatomic, assign) float diameter; //直徑
?
- (void)acceptComponentVisitor:(id<NimoComponentVisitor>) visitor;
?
@end

?

?

?


#import "NimoWheel.h"
?
@implementation NimoWheel
?
- (id)init
{
??? self = [super init];
??? if (self) {
??????? _diameter = 400.0f;
??? }
??? return self;
}
?
- (void)acceptComponentVisitor:(id<NimoComponentVisitor>) visitor
{
??? [visitor visitWheel:self];
}
?
-(NSString *)description
{
??? return [NSString stringWithFormat:@"Wheel: %f mm", _diameter];
}
?
@end


添加訪問支持的Car類

?

?

?


#import <Foundation/Foundation.h>
#import "NimoComponentVisitor.h"
?
@class NimoEngine, NimoWheel;
?
@interface NimoCar : NSObject
?
@property (nonatomic) NimoEngine *engine;
@property (nonatomic, readonly) NSArray *arrayOfWheels;
?
- (void)addWheel:(NimoWheel *)wheel atIndex:(NSUInteger) index;
?
- (void)acceptComponentVisitor:(id<NimoComponentVisitor>) visitor;
@end

?

?

?


#import "NimoCar.h"
#import "NimoEngine.h"
#import "NimoWheel.h"
?
@interface NimoCar()
?
@property (nonatomic, readwrite) NSMutableArray *mutableArrayOfWheels;
?
@end

?

?

?


@implementation NimoCar
?
- (id)init
{
??? if (self = [super init]) {
??????? _mutableArrayOfWheels = [[NSMutableArray alloc] initWithCapacity:4];
??? }
????
??? return self;
}
?
- (void)addWheel:(NimoWheel *)wheel atIndex:(NSUInteger) index
{
??? [_mutableArrayOfWheels insertObject:wheel atIndex:index];
}
?
- (NSArray *)arrayOfWheels
{
??? return [_mutableArrayOfWheels copy];
}
?
- (void)acceptComponentVisitor:(id<NimoComponentVisitor>) visitor
{
??? [_engine acceptComponentVisitor:visitor];
??? for (NimoWheel *wheel in self.arrayOfWheels) {
??????? [wheel acceptComponentVisitor:visitor];
??? }
}
?
- (NSString *)description
{
??? return [NSString stringWithFormat:@"My car: %@", [NSDictionary dictionaryWithObjects:@[_engine, self.arrayOfWheels] forKeys:@[@"Engine", @"Wheels"]]];
}
?
@end


我們在類中添加了-(void)acceptComponentVisitor:(id<NimoComponentVisitor>)visitor接口,同意實現了訪問者協議的visitor訪問。(我家大門常打開,啦啦啦啦啦)

?

讓我們來看下第一位訪問者是誰?剛剛上面我們有提到一個需求,想對汽車各組件進行全面升級。那么就讓這位專業的訪問者來做吧!

定義具體訪問者:此訪問者具備升級汽車各組件的能力

?

#import <Foundation/Foundation.h>
#import "NimoComponentVisitor.h"
?
@interface NimoComponentUpgrade : NSObject <NimoComponentVisitor>
?
- (void) visitEngine:(NimoEngine *) engine;
- (void) visitWheel:(NimoWheel *) wheel;
?
@end

?

?

?


#import "NimoComponentUpgrade.h"
?
@implementation NimoComponentUpgrade
?
- (void) visitEngine:(NimoEngine *) engine
{
??? NSLog(@"我是升級人員,正在對引擎<%@>進行升級", engine);
}
?
- (void) visitWheel:(NimoWheel *) wheel
{
??? NSLog(@"我是升級人員,正在對車輪<%@>進行升級", wheel);
}
?
@end


讓我們來看看這位訪問者的工作能力如何

?

?

?


#import <Foundation/Foundation.h>
#import "NimoCar.h"
#import "NimoEngine.h"
#import "NimoWheel.h"
#import "NimoComponentMaintenance.h"
#import "NimoComponentUpgrade.h"
?
int main(int argc, const char * argv[]) {
??? @autoreleasepool {
????????
??????? NimoCar *car = [[NimoCar alloc] init];
??????? NimoEngine *engine = [[NimoEngine alloc] initWithModelName:@"V8"];
??????? NimoWheel *wheelA = [[NimoWheel alloc] init];
??????? NimoWheel *wheelB = [[NimoWheel alloc] init];
??????? NimoWheel *wheelC = [[NimoWheel alloc] init];
??????? NimoWheel *wheelD = [[NimoWheel alloc] init];
????????
??????? car.engine = engine;
??????? [car addWheel:wheelA atIndex:0];
??????? [car addWheel:wheelB atIndex:1];
??????? [car addWheel:wheelC atIndex:2];
??????? [car addWheel:wheelD atIndex:3];
????????
??????? NSLog(@"%@", car);
????????
??????? //對組建進行“升級”
??????? NimoComponentUpgrade *upgradeVisitor = [[NimoComponentUpgrade alloc] init];
??????? [car acceptComponentVisitor:upgradeVisitor];
??? }
??? return 0;
}

?

?

?

201632293606776.jpg (768×243)

看來這位訪問者的工作很出色。

如果我們還需要對汽車各組件進行維修呢?那就定義一個專職維修的訪問者

?

#import <Foundation/Foundation.h>
#import "NimoComponentVisitor.h"
?
@interface NimoComponentMaintenance : NSObject <NimoComponentVisitor>
?
- (void) visitEngine:(NimoEngine *) engine;
- (void) visitWheel:(NimoWheel *) wheel;
?
@end

?

?

?


#import "NimoComponentMaintenance.h"
?
@implementation NimoComponentMaintenance
?
- (void) visitEngine:(NimoEngine *) engine
{
??? NSLog(@"我是維修人員,正在對引擎<%@>進行維修", engine);
}
?
- (void) visitWheel:(NimoWheel *) wheel
{
??? NSLog(@"我是維修人員,正在對車輪<%@>進行維修", wheel);
}
?
@end

?

?

?


//main.m
??????? ...
??????? //對組建進行“維修”
??????? NimoComponentMaintenance *maintenanceVisitor = [[NimoComponentMaintenance alloc] init];
??????? [car acceptComponentVisitor:maintenanceVisitor];
??????? ...
???????


使用訪問者模式后,添加操作,只需實現具體的訪問者,不會對類的結構造成破壞。

實例講解iOS應用的設計模式開發中的Visitor訪問者模式,想必大家現在心中都會有了答案,武林技術頻道這個網址小編大力推薦,里面有著不少的資源可供你利用哦。

?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲影院高清在线| 成人97在线观看视频| 亚洲日本中文字幕免费在线不卡| 欧美精品生活片| 欧美成人黑人xx视频免费观看| 色噜噜久久综合伊人一本| 午夜精品一区二区三区视频免费看| 国产精品美女网站| 2021久久精品国产99国产精品| 亚洲最大的av网站| 亚洲老头同性xxxxx| 国产亚洲精品久久久久久| 国产精品美女av| 91精品国产乱码久久久久久蜜臀| 精品亚洲一区二区三区在线观看| 97免费在线视频| 成人网欧美在线视频| 精品国产一区二区三区久久久狼| 91成人免费观看网站| 一个色综合导航| 日本成人精品在线| 在线视频中文亚洲| 啊v视频在线一区二区三区| 亚洲日本aⅴ片在线观看香蕉| 亚洲精品97久久| 亚洲人成网站在线播| 国产精品老女人视频| 懂色aⅴ精品一区二区三区蜜月| 中文字幕亚洲综合久久| 精品露脸国产偷人在视频| 国产欧美一区二区三区四区| 亚洲天堂开心观看| 一区二区亚洲欧洲国产日韩| 国产日本欧美在线观看| 日本中文字幕成人| 亚洲精品久久久久久久久久久久| 日韩欧美视频一区二区三区| 国产精品麻豆va在线播放| 国产欧美一区二区三区久久| 国产亚洲人成a一在线v站| 久久精品色欧美aⅴ一区二区| 亚洲性线免费观看视频成熟| 亚洲第一av在线| 国产精品视频色| 91国内揄拍国内精品对白| 亚洲欧洲日产国产网站| 国产亚洲aⅴaaaaaa毛片| 亚洲成色www8888| 成人网址在线观看| 日韩在线视频观看| 中文日韩电影网站| 久久香蕉国产线看观看网| 国产精品美女久久久久久免费| 亚洲a中文字幕| 国产大片精品免费永久看nba| 国产剧情日韩欧美| 欧美xxxx14xxxxx性爽| 午夜精品久久久久久久99热浪潮| 97成人超碰免| 国产亚洲综合久久| 欧美专区在线视频| 精品久久久久久久久久久久久| 久久综合久久八八| 欧美日韩性视频在线| 成人黄色大片在线免费观看| 亚洲成人性视频| 欧美亚州一区二区三区| 成人淫片在线看| 国产成人精品电影久久久| 久久91超碰青草是什么| 久久频这里精品99香蕉| 亚洲男人天堂手机在线| 91高清视频免费观看| 久久精品中文字幕一区| 国产盗摄xxxx视频xxx69| 日韩中文字幕亚洲| 国产日韩综合一区二区性色av| 国产一区二区三区视频在线观看| 久久久精品国产一区二区| 国产日韩欧美在线| 欧美有码在线视频| 国模私拍一区二区三区| 久久精品成人一区二区三区| 国产盗摄xxxx视频xxx69| 亚洲精品国产美女| 国产一区二区三区精品久久久| 亚洲日本aⅴ片在线观看香蕉| 91久久国产综合久久91精品网站| 欧美成人自拍视频| 精品国产老师黑色丝袜高跟鞋| 午夜精品久久17c| 在线亚洲欧美视频| 日韩av网站导航| 精品久久久999| 91亚洲一区精品| 91亚洲精品在线观看| 精品久久香蕉国产线看观看亚洲| 丝袜亚洲欧美日韩综合| 亚洲网站视频福利| 黄色一区二区在线观看| 欧美福利在线观看| 欧美劲爆第一页| 日韩欧美在线播放| 亚洲精品自在久久| 精品五月天久久| 国产精品96久久久久久又黄又硬| 久久久av电影| 成人黄色免费片| 日韩在线视频观看| 欧美夫妻性生活视频| 日本精品一区二区三区在线| 成人激情视频在线| 国产性猛交xxxx免费看久久| 97免费在线视频| 亚洲综合色av| 成人免费高清完整版在线观看| 日本欧美精品在线| 国产精品视频一区二区三区四| 亚洲电影第1页| 一区二区三区视频免费在线观看| 欧美性猛交xxxx免费看| 亚洲第一天堂无码专区| 日韩在线观看免费高清完整版| 亚洲另类欧美自拍| 精品国偷自产在线| 久久天天躁狠狠躁老女人| 成人在线精品视频| 日本高清不卡的在线| 在线观看欧美www| 91国语精品自产拍在线观看性色| 亚洲自拍欧美色图| 日本精品视频网站| 亚洲久久久久久久久久久| 欧美日本中文字幕| 91理论片午午论夜理片久久| 亚洲自拍偷拍网址| 日本精品久久久久影院| 97av视频在线| 亚洲成人久久一区| 国产精品av免费在线观看| 欧美成人精品在线播放| 成人在线中文字幕| 91极品女神在线| 欧美一级大片在线免费观看| 欧美日韩不卡合集视频| 91天堂在线视频| 不卡av在线播放| 欧美日韩另类字幕中文| 日本一本a高清免费不卡| 97碰碰碰免费色视频| 日韩大陆毛片av| 日韩电视剧在线观看免费网站| 国产日韩欧美综合| 欧美一级淫片丝袜脚交| 91亚洲精品视频| 欧美在线视频一二三| 日韩精品在线看| 久久人人爽国产| 欧美日韩加勒比精品一区| 日韩精品视频免费| 北条麻妃在线一区二区| 91性高湖久久久久久久久_久久99| 国产日韩欧美影视| 日韩精品电影网|