iOS App 디자인 모델 개발 에서 전략 모델 의 실현 예시

6669 단어 iOS디자인 모드
이번 에는 전략 모델(Strategy Pattern)을 소개 하 는데 그 에 비해 비교적 간단 한 모델 이다.정책 모델(Policy Pattern)이 라 고도 합 니 다.전략 모델 은 대상 을 대상 으로 하 는 계승 과 다 중 체 제 를 사용 하 는데 다른 것 은 현묘 한 기회 가 없다.전략 모드 는 다음 과 같이 사용 하기에 적합 합 니 다.1.여러 가지 유형 은 알고리즘 이나 행위 에 있어 서 만 약간 다른 장면 이 있 습 니 다.2.알고리즘 은 자 유 롭 게 전환 하 는 장면 이 필요 합 니 다.3.알고리즘 규칙 을 차단 하 는 장면 이 필요 합 니 다.전략 모델 을 사용 하 는 데 도 당연히 주의해 야 할 부분 이 있다.그러면 전략 류 가 너무 많 지 않다 는 것 이다.만약 에 한 전략 가족의 구체 적 인 전략 수량 이 4 개 를 초과 하면 혼합 모델 을 고려 하여 전략 류 의 팽창 과 대외 노출 문 제 를 해결 해 야 한다.실제 프로젝트 에서 우 리 는 일반적으로 공장 방법 모델 을 통 해 전략 류 의 성명 을 실현 한다.
다음은 전략 모델 을 구체 적 으로 설명 하 겠 습 니 다.
정책 모드 정의:
define a family of algorithms,encapsulate each one,and make them interchangeable.(알고리즘 을 정의 하고 모든 알고리즘 을 패키지 하 며 서로 바 꿀 수 있 습 니 다.)
다음은 전략 모델 의 클래스 구조 도 를 다음 과 같이 보 여 드 리 겠 습 니 다.
2016330112133305.jpg (500×165)
그림 에서 보 듯 이 Strategy 류 의 차원 은 Context 로 일련의 재 활용 가능 한 알고리즘 과 행 위 를 정 의 했 고 계승 은 이러한 알고리즘 중의 공공 기능 을 분석 하 는 데 도움 이 된다.다음은 내 가 일반 슈퍼마켓 에서 비용 을 받 는 예 로 이 모델 을 간단하게 모 의 했다.나 는 그 중 에 대응 하 는 종 류 를 소개 한다.
Context 류―CashContext 류
전략 류―CCashSuper 류―
Concrete Strategya 류―-Cash Normal 류
Concrete StrategyB 류―-CashRebate 류
Concrete Strategy C 류―-Cash Return 류
네,위 에 보 여 드릴 Objective C 소스 코드 클래스 입 니 다.
다음은 제 가 위 에 대응 하 는 종 류 를 보 여 드 리 겠 습 니 다.여러분 께 참고 하 시기 바 랍 니 다.
주의:본 논문 의 모든 코드 는 ARC 환경 에서 컴 파일 되 었 습 니 다.
CashContext 클래스 인터페이스

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

@interface CashContext :NSObject{
@private CashSuper *cs;
}
-(CashContext*)MyInit:(int)Types;
-(void)SetCashSuper:(CashSuper*)cashSuper;
-(double)GetResult:(double)money;
@end

CashContext 클래스 구현

#import "CashContext.h"
#import "CashNormal.h"
#import "CashRebate.h"
#import "CashReturn.h"

@implementation CashContext

-(CashContext*)MyInit:(int)Types{
    int myTypes;
    myTypes = Types;
    switch(myTypes) {
        case 1:
            [self SetCashSuper:[[CashNormalalloc]init]];
            break;
        case 2:
            [self SetCashSuper:[[CashReturnalloc]MyInit:300 And:100]];
            break;
        case 3:
            [self SetCashSuper:[[CashRebatealloc]MyInit:0.8]];
            break;
        default:
            break;
    }
    return self;
}
-(void)SetCashSuper:(CashSuper*)cashSuper{
    cs = cashSuper;
}
-(double)GetResult:(double)money{
    return [cs AcceptCash:money];
}

@end

CashSuper 클래스 인터페이스

#import <Foundation/Foundation.h>

@interface CashSuper :NSObject
-(double)AcceptCash:(double)money;
@end

CashSuper 클래스 실현

#import"CashSuper.h"

@implementation CashSuper

-(double)AcceptCash:(double)money{
    return -1.0; // -1.0 ,
}

@end

Cash Normal 클래스 인터페이스

#import"CashSuper.h"

@interface CashNormal :CashSuper
@end

Cash Normal 류 실현

#import"CashNormal.h"

-(double)AcceptCash:(double)money{
    return money;
}

@end

CashRebate 클래스 인터페이스

#import"CashSuper.h"

@interface CashRebate :CashSuper{
@private double moneyRebate;
}
@property double moneyRebate;
-(CashRebate*)MyInit:(double)moneyRebates;
@end

CashRebate 실현

#import"CashRebate.h"

@implementation CashRebate
@synthesize moneyRebate;

-(CashRebate*)MyInit:(double)moneyRebates{
    [self setMoneyRebate:moneyRebates];
    return self;
}
-(double)AcceptCash:(double)money{
    return moneyRebate*money;
}

@end

CashReturn 클래스 인터페이스

#import "CashSuper.h"

@interface CashReturn :CashSuper{
@private double moneyCondition;
@private double moneyReturn;
}
@property double moneyCondition;
@property double moneyReturn;
-(CashReturn*)MyInit:(double)moneyConditions And:(double)moneyReturns;
@end

CashReturn 클래스 구현

#import "CashReturn.h"

@implementation CashReturn
@synthesize moneyReturn;
@synthesize moneyCondition;

-(CashReturn*)MyInit:(double)moneyConditions  And:(double)moneyReturns{
    [self setMoneyReturn:moneyReturns];
    [self setMoneyCondition:moneyConditions];
    return self;
}
-(double)AcceptCash:(double)money{
    double result;
    result = money;
    @try{
        if(money >=moneyCondition){
            result = money - (money /moneyCondition)*moneyReturn;
        }
    }
    @catch(NSException *exception) {
        NSLog(@"Oh!Man!!CashReturn has something wrong!");
    }
    @finally{
        return result;
    }
}

@end

메 인 방법 호출

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

int main (int argc, const char  *argv[])
{
    @autoreleasepool {
        CashContext *cc = [[CashContext alloc]MyInit:3];
        double total;
        total = [cc GetResult:400];
        NSLog(@"Total Money 400,the resual is %f", total);
    }
    return 0;
}

이상 은 대응 하 는 정책 모델 에 해당 하 는 클래스 입 니 다.한 가지 설명 이 필요 한 것 은 이 코드 들 은 ARC 환경 에서 작 성 된 것 이기 때문에 그 중의 자원 을 수 동 으로 방출 할 필요 가 없습니다.그래서 일부 전달 지침 은 수 동 으로 풀 리 지 않 았 다 는 점 을 설명 한다.
어떤 상황 에서 전략 모델 을 사용 해 야 합 니까?사실은 제 이 해 는 우리 가 수 요 를 분석 하 는 과정 에서 서로 다른 시간 에 서로 다른 업무 규칙 을 응용 해 야 전략 모델 로 이런 변 화 를 처리 할 가능성 을 고려 할 수 있다 는 것 입 니 다.또한 전략 모델 의 장점 은 단원 테스트 를 간소화 하 는 것 이다.모든 알고리즘 은 자신의 유형 이 있 기 때문에 자신의 인 터 페 이 스 를 통 해 단독으로 테스트 할 수 있다.

좋은 웹페이지 즐겨찾기