1. 程式人生 > >IOS設計架構模式:構建者模式和中介者模式

IOS設計架構模式:構建者模式和中介者模式

一、構建者模式

       什麼是構建者模式?

       將一個“複雜物件的構建演算法”與它的“部件及組裝方式”分離,使得構建演算法和組裝方式可以獨立應對變化;複用同樣的構建演算法可以建立不同的表示,不同的構建過程可以複用相同的部件組裝方式。

       比如,建造一棟大廈,那麼就需要一個總建築工程師(也就是指導者,相當於uml圖中的組裝者),N個包工頭(也就是承包商,相當於uml圖中的構建者),一個包工頭有M個小工(也就是搬磚的、貼磚的、木工等等,相當於uml圖中的生成者),指導者可以使用承包商A、承包商B、承包商C的自由組合,單個承包商又可以使用搬磚的、貼磚的、木工的自由組合,這樣就把構建和組裝分離開了。

       在建立者模式中,客戶端不再負責物件的建立與組裝,而是把這個物件建立的責任交給其具體的建立者類,把組裝的責任交給組裝類,客戶端只負責物件的呼叫,從而明確了各個類的職責。雖然利用建立者模式可以創建出不同型別的產品,但是如果產品之間的差異巨大,則需要編寫多個建立者類才能實現,如果這樣結合工廠模式更好。

        程式碼示例:

建立構建者協議類Builder

#import <Foundation/Foundation.h>

// 構建者
@protocol Builder <NSObject>

// 構建部分
- (NSString *)builderPart;
@end

建立具體生成者類ConcreteBuild 
ConcreteBuild.h

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

@interface ConcreteBuild : NSObject <Builder>

@end

ConcreteBuild.m

#import "ConcreteBuild.h"

@implementation ConcreteBuild

#pragma mark - Builder
- (NSString *)builderPart {
    return @"實現協議, 返回產品";
}
@end

建立組裝者類Director

Director.h

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

@interface Director : NSObject

// 建立傳入的實現者
- (instancetype)initWithBuilder:(id<Builder>)builder;

// 建造
- (NSString *)construct;
@end

Director.m

#import "Director.h"

@interface Director ()
@property (nonatomic, copy) id<Builder> builder;
@end

@implementation Director
- (instancetype)initWithBuilder:(id<Builder>)builder {
    self = [super init];
    if (self) {
        _builder = builder;
    }
    return self;
}

// 建造
- (NSString *)construct {
    // 建立部件
    return [self.builder builderPart];
}
@end

ViewController呼叫

#import "ViewController.h"
#import "Director.h"
#import "ConcreteBuild.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    // 1.建立生成者, 知道要做的產品
    ConcreteBuild *build = [[ConcreteBuild alloc] init];
    NSString *str2 = [build builderPart];

    // 2.建立承包商
    Director *director = [[Director alloc] initWithBuilder:build];

    // 3.交付產品
    NSString *str = [director construct];
    NSLog(@"str = %@, str2 = %@",str, str2);

}

@end

離開就離開就是

       構建者模式