인 스 턴 스 분석 디자인 모델 의 외관 모델 이 iOS App 개발 에서 의 활용

8012 단어 디자인 모드iOS
외관 모드(Facade)는 서브 시스템 의 인터페이스 에 일치 하 는 인 터 페 이 스 를 제공 합 니 다.이 모델 은 고 층 인 터 페 이 스 를 정의 합 니 다.이 인 터 페 이 스 는 이 서브 시스템 을 더욱 쉽게 사용 할 수 있 습 니 다.
다음은 여러분 에 게 유형의 구조 도 를 보 여 드 리 겠 습 니 다.보시 면 아 실 겁 니 다.
2016330142327941.jpg (500×325)
사실 이 모델 에서 유형 과 유형 간 의 계승 관 계 는 없고 간단 한 유형 인용 을 하여 대외 인 터 페 이 스 를 통일 시 켰 을 뿐이다.쉬 워 보이 지 않 아 요?쓸데없는 소리 그만 하고 코드 를 간단하게 보 여 드 리 겠 습 니 다!
주의:본 논문 의 모든 코드 는 ARC 환경 에서 컴 파일 되 었 습 니 다.
SubSystem One 클래스 인터페이스

#import <Foundation/Foundation.h>

@interface SubSystemOne:NSObject
-(void)MethodOne;
@end

SubSystem One 클래스 구현

#import "SubSystemOne.h"

@implementation SubSystemOne
-(void)MethodOne{
    NSLog(@" ");
}
@end

SubSystem 두 가지 인터페이스

#import <Foundation/Foundation.h>

@interface SubSystemTwo:NSObject
-(void)MethodTwo;
@end

SubSystem 두 가지 구현

#import "SubSystemTwo.h"

@implementation SubSystemTwo
-(void)MethodTwo{
    NSLog(@" ");
}
@end

SubSystem 3 클래스 인터페이스

#import <Foundation/Foundation.h>

@interface SubSystemThree:NSObject
-(void)MethodThree;
@end

SubSystem Three 클래스 구현

#import "SubSystemThree.h"

@implementation SubSystemThree
-(void)MethodThree{
    NSLog(@" ");
}
@end

SubSystem 4 클래스 인터페이스

#import <Foundation/Foundation.h>

@interface SubSystemFour:NSObject
-(void)MethodFour;
@end

SubSystem 4 류 구현

#import "SubSystemFour.h"

@implementation SubSystemFour
-(void)MethodFour{
    NSLog(@" ");
}
@end

Facade 클래스 인터페이스

#import<Foundation/Foundation.h>

@class SubSystemOne;// @class ( )
@class SubSystemTwo;
@class SubSystemThree;
@class SubSystemFour;
@interface Facade :NSObject{
@private SubSystemOne *one;
@private SubSystemTwo *two;
@private SubSystemThree *three;
@private SubSystemFour *four;
}
-(Facade*)MyInit;
-(void)MethodA;
-(void)MethodB;
@end

Facade 류 실현

#import "Facade.h"
#import "SubSystemOne.h"
#import "SubSystemTwo.h"
#import "SubSystemThree.h"
#import "SubSystemFour.h"

@implementation Facade
-(Facade*)MyInit{
    one= [[SubSystemOne alloc]init];
    two= [[SubSystemTwo alloc]init];
    three= [[SubSystemThree alloc]init];
    four= [[SubSystemFour alloc]init];
    return self;
}
-(void)MethodA{
    NSLog(@"
A() ---- ");
    [one MethodOne];
    [two MethodTwo];
    [three MethodThree];
    [four MethodFour];
}
-(void)MethodB{
    NSLog(@"
B() ---- ");
    [two MethodTwo];
    [three MethodThree];
}
@end

Main()방법 호출

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

int main (int argc,const char * argv[])
{
    @autoreleasepool{
        Facade *facade = [[Facade alloc]MyInit];
        [facade MethodA];
        [facade MethodB];
    }
    return 0;
}

소프트웨어 를 개발 할 때 외관 모델 을 사용 하 는 상황 을 고려 하면 일반적으로 세 가지 상황 으로 나 뉜 다.첫 번 째 상황 은 디자인 초기 단계 에 서로 다른 두 개의 층 을 의식 적 으로 분리 하고 층 과 층 간 에 외관 Facade 를 구축 해 야 한다.그러면 복잡 한 서브 시스템 에 간단 한 인 터 페 이 스 를 제공 하여 결합 을 크게 낮 출 수 있다.두 번 째 상황 에서 개발 단계 에 서브 시스템 은 끊 임 없 는 재 구성 과 진화 로 인해 점점 복잡 해 지고 외관 Facade 를 증가 하면 간단 한 인 터 페 이 스 를 제공 하여 그들의 의존 을 줄 일 수 있다.세 번 째 상황 은 남 겨 진 대형 시스템 을 유지 할 때 이 시스템 은 유지 하기 어렵 고 확장 하기 어 려 울 것 이다.만약 에 새로운 수요 가 있 으 면 새로운 시스템 에 외관 Facade 류 를 개발 하여 디자인 이 거 칠 거나 고도 로 복잡 한 남 겨 진 코드 의 비교적 뚜렷 하고 간단 한 인 터 페 이 스 를 제공 하여 새로운 시스템 과 Facade 대상 이 상호작용 을 하도록 할 수 있다.Facade 는 남 겨 진 코드 와 모든 복잡 한 작업 을 상호작용 하면 비교적 낮은 결합 도 를 유지 할 수 있다.
인 스 턴 스 진급
현재 로 컬 에 앨범 데 이 터 를 저장 하고 HTTP Client 에서 원 격 통신 을 처리 하 는 Persistency Manager 가 있 습 니 다.프로젝트 의 다른 종 류 는 이런 논리 와 관계 가 없다.
이 모드 를 실행 하면 Library API 만 Persistency Manager 와 HTTP Client 의 인 스 턴 스 를 저장 합 니 다.이후 Library API 는 이 서비스 에 접근 하기 위 한 간단 한 API 를 공개 할 것 이다.
2016330142357578.png (480×71)
Library API 는 다른 코드 에 공개 되 지만 앱 에 있 는 HTTP Client 와 Persistency Manager 의 복잡 한 부분 을 숨 깁 니 다.
Library API.h 를 열 고 맨 위 에 면 파일 을 가 져 옵 니 다:
#import "Album.h"
다음은 Library API.h 에 다음 과 같은 방법 을 추가 합 니 다.

- (NSArray*)getAlbums;
- (void)addAlbum:(Album*)album atIndex:(int)index;
- (void)deleteAlbumAtIndex:(int)index;
현재 이 방법 들 은 모두 다른 종류 에 공개 되 었 다.
Library API.m 파일 에 다음 두 개의 파일 을 도입 합 니 다.
#import "PersistencyManager.h"
#import "HTTPClient.h"
이곳 에서 만 이런 종 류 를 도입 해 야 한다.기억 하기:당신 의 API 는 복잡 한 시스템 의 유일한 접속 점 이 될 것 입 니 다.
현재 클래스 확장 에 개인 속성 을 추가 합 니 다(@implementation 위)

@interface LibraryAPI () {
    PersistencyManager *persistencyManager;
    HTTPClient *httpClient;
    BOOL isOnline;
}
@end
isOnline 은 앨범 목록 데이터 가 바 뀌 면 서버 에 업데이트 할 수 있 는 지,예 를 들 어 앨범 을 추가 하거나 삭제 할 수 있 는 지 판단 합 니 다.
init 방법 에서 이 변 수 를 초기 화해 야 합 니 다.Library API.m 에 다음 코드 를 추가 하 십시오.

- (id)init
{
    self = [super init];
    if (self) {
        persistencyManager = [[PersistencyManager alloc] init];
        httpClient = [[HTTPClient alloc] init];
        isOnline = NO;
    }
    return self;
}
이 HTTP 클 라 이언 트 는 여기 서 진정한 작업 이 아 닙 니 다.외관 디자인 에서 시범 적 인 용법 의 역할 을 하기 때문에 isOnline 은 영원히 NO 입 니 다.
다음은 Library API.m 에 다음 세 가지 방법 을 추가 합 니 다.

- (NSArray*)getAlbums
{
    return [persistencyManager getAlbums];
}

- (void)addAlbum:(Album*)album atIndex:(int)index
{
    [persistencyManager addAlbum:album atIndex:index];
    if (isOnline)
    {
        [httpClient postRequest:@"/api/addAlbum" body:[album description]];
    }
}

- (void)deleteAlbumAtIndex:(int)index
{
    [persistencyManager deleteAlbumAtIndex:index];
    if (isOnline)
    {
        [httpClient postRequest:@"/api/deleteAlbum" body:[@(index) description]];
    }
}

addAlbum:atIndex:를 보 세 요.이 종 류 는 먼저 로 컬 데 이 터 를 업데이트 하고 인터넷 을 연결 하면 원 격 서버 를 업데이트 합 니 다.이것 이 바로 외관 디자인 의 장점 이다.일부 시스템 밖의 클래스 가 새 앨범 을 추 가 했 을 때,그것 은 모 르 고,알 필요 도 없 는 복잡 한 내부 시스템 이다.
알림:하위 시스템 에서 외관 류 를 디자인 할 때 고객 이 이러한'숨 김'류 에 접근 하 는 것 을 막 을 수 있 는 것 이 없다 는 것 을 기억 하 세 요.방어 적 인 코드 를 많이 써 야 합 니 다.모든 고객 이 똑 같은 방식 으로 당신 의 외관 류 를 사용 할 것 이 라 고 생각 하지 마 세 요.
프로그램 을 실행 하면 검 은 바탕 에 빈 내용 의 화면 을 볼 수 있 습 니 다.아래 와 같이:
2016330142423756.png (211×320)

좋은 웹페이지 즐겨찾기