アダプタモード学習

7211 ワード

アダプタモード学習
理解する
YouXianMingのgithubを見て印象を深める必要があると感じました.
アダプタを使用する前提は、前に完全なロジックがセットされていて、それから前に満たされなかったロジックが新しく追加されたことです.このとき、アダプタを使用することができます.既存の論理が完全に存在しない場合は、直接使用することをお勧めしません.後続が変わるかどうか分からないからです.もしその後も変わらなかったら.....
現在、viewが複数のmodelクラスに対応している場合にviewとmodelを分離するための方法しか考えられない.まずprotocolプロトコルを定義し、viewが特定のデータを取得する方法を宣言します.
@protocol AdapterProtocol 

- (NSString *)name;
- (NSString *)phoneNumber;

@end

アダプタはこのプロトコルに従い、その方法を実装します.
アダプタベースクラス
@interface BusinessCardAdapter : NSObject 

/**
 *      
 */
@property (nonatomic, weak) id data;

/**
 *           
 *
 *  @param data      
 *
 *  @return     
 */
- (instancetype)initWithData:(id)data;

@end

@implementation BusinessCardAdapter

- (instancetype)initWithData:(id)data {
    if (self = [super init]) {
        self.data = data;
    }
    return self;
}

- (NSString *)name {
    return nil;
}

- (NSString *)phoneNumber {
    return nil;
}

@end

異なるモデルタイプ
  • NormalModel
  • @interface NormalModel : NSObject
    
    /**
     *    
     */
    @property (nonatomic, strong) NSString *name;
    
    /**
     *      
     */
    @property (nonatomic, strong) UIColor  *lineColor;
    
    /**
     *      
     */
    @property (nonatomic, strong) NSString *phoneNumber;
    
    @end
    
  • SpecialModel
  • @interface SpecialModel : NSObject
    
    /**
     *    
     */
    @property (nonatomic, strong) NSString *name;
    
    /**
     *      
     */
    @property (nonatomic, strong) NSString *colorString;
    
    /**
     *      
     */
    @property (nonatomic, strong) NSString *phoneNumber;
    
    
    @end
    

    2つのデータモデルで色を表す部分が異なることがわかります.NormalModelでは標準の色オブジェクトが色を表し、SpecialModelでは色文字列が色を表します.
    オブジェクトアダプタ
    オブジェクトアダプタとは、同じアダプタクラスで入力されたデータをデータに適合させることです.
    @interface CommonUsedAdapter : BusinessCardAdapter
    
    @end
    
    @implementation CommonUsedAdapter
    
    - (NSString *)name {
        NSString *name = nil;
        if ([self.data isMemberOfClass:[SpecialModel class]]) {
            SpecialModel *model = self.data;
            name                = model.name;
        } else if ([self.data isMemberOfClass:[NormalModel class]]) {
            NormalModel *model = self.data;
            name               = model.name; 
        } else {
            name = nil;   
        }
        return name;
    }
    
    - (UIColor *)lineColor {
        UIColor *lineColor = nil;
        if ([self.data isMemberOfClass:[SpecialModel class]]) {
            SpecialModel *model = self.data;
            if ([model.colorString isEqualToString:@"red"]) {
                lineColor = [UIColor redColor];
            } else if ([model.colorString isEqualToString:@"green"]) {
                lineColor = [UIColor greenColor];
            } else {
                lineColor = [UIColor blackColor];
            }
        } else if ([self.data isMemberOfClass:[NormalModel class]]) {
            NormalModel *model = self.data;
            lineColor          = model.lineColor;
        } else {
            lineColor = nil;
        }
        return lineColor;
    }
    
    - (NSString *)phoneNumber {
        NSString *phoneNumber = nil;  
        if ([self.data isMemberOfClass:[SpecialModel class]]) {    
            SpecialModel *model = self.data;
            phoneNumber         = model.phoneNumber;
        } else if ([self.data isMemberOfClass:[NormalModel class]]) {
            NormalModel *model = self.data;
            phoneNumber        = model.phoneNumber; 
        } else {
            phoneNumber = nil;   
        }
        return phoneNumber;
    }
    
    @end
    
    

    viewアダプタは、プロトコルを呼び出す方法でデータを取得します.
    .h
    /**
     *      (   BusinessCardAdapterProtocol     )
     *
     *  @param data    BusinessCardAdapterProtocol     
     */
    - (void)loadData:(id )data;
    

    アダプタからのデータの取得
    .m
    - (void)loadData:(id )data {
    
        self.name        = [data name];
        self.lineColor   = [data lineColor];
        self.phoneNumber = [data phoneNumber];
    }
    

    外部からviewを初期化した後、viewにデータを追加する場合は、まず具体的なデータモデルモデルモデルに基づいてアダプタを初期化し、その後、view viewにアダプタを渡して具体的なデータのタイプや論理に関心を持たず、表示作用のみをします.
        //    
        NormalModel *data1 = [[NormalModel alloc] init];
        data1.name         = @"YouXianMing";
        data1.lineColor    = [UIColor redColor];
        data1.phoneNumber  = @"159 - 1051 - 4636";
        
        //    
        SpecialModel *data2 = [[SpecialModel alloc] init];
        data2.name          = @"NoZuoNoDie";
        data2.colorString   = @"green";
        data2.phoneNumber   = @"159 - 1051 - 4636";
        
        //        (      data1  data2)
        //BusinessCardAdapter *adapter = [[CommonUsedAdapter alloc] initWithData:data1];
        BusinessCardAdapter *adapter = [[CommonUsedAdapter alloc] initWithData:data2];
        BusinessCardView *cardView   = [[BusinessCardView alloc] initWithFrame:BUSINESS_FRAME];
        cardView.center              = self.view.center;
        [cardView loadData:adapter];
    

    ロジックはアダプタによって特定のデータに基づいて処理されます.
    クラスアダプタ
    クラスアダプタは、各modelに対してアダプタベースクラスに継承されたサブアダプタクラスに対応します.
  • SpecialModel対応アダプタ
  • @interface SpecialModelAdapter : BusinessCardAdapter
    
    @end
    
    @implementation SpecialModelAdapter
    
    - (NSString *)name {
        SpecialModel *model = self.data;
        return model.name;
    }
    
    - (UIColor *)lineColor {
        SpecialModel *model = self.data;
        UIColor *color = nil;
        if ([model.colorString isEqualToString:@"red"]) {
            color = [UIColor redColor]; 
        } else if ([model.colorString isEqualToString:@"green"]) {
            color = [UIColor greenColor];
        } else {
            color = [UIColor blackColor];   
        } 
        return color;
    }
    
    - (NSString *)phoneNumber {
        SpecialModel *model = self.data;
        return model.phoneNumber;
    }
    
    @end
    
    
  • NormalModel対応アダプタ
  • @interface NormalModelAdapter : BusinessCardAdapter
    
    @end
    
    @implementation NormalModelAdapter
    
    - (NSString *)name {
        NormalModel *model = self.data;
        return model.name;
    }
    
    - (UIColor *)lineColor {
        NormalModel *model = self.data;
        return model.lineColor;
    }
    
    - (NSString *)phoneNumber {  
        NormalModel *model = self.data;
        return model.phoneNumber;
    }
    
    @end
    

    外部からviewにデータを埋め込む場合:
  •     //    
        NormalModel *data = [[NormalModel alloc] init];
        data.name         = @"YouXianMing";
        data.lineColor    = [UIColor redColor];
        data.phoneNumber  = @"159 - 1051 - 4636";
        
        //     
        BusinessCardAdapter *adapter = [[NormalModelAdapter alloc] initWithData:data];
        BusinessCardView *cardView   = [[BusinessCardView alloc] initWithFrame:BUSINESS_FRAME];
        cardView.center              = self.view.center;
        [cardView loadData:adapter];
    
  • もう一つの
  • //    
        SpecialModel *data = [[SpecialModel alloc] init];
        data.name          = @"NoZuoNoDie";
        data.colorString   = @"green";
        data.phoneNumber   = @"159 - 1051 - 4636";
        
        //     
        BusinessCardAdapter *adapter = [[SpecialModelAdapter alloc] initWithData:data];
        BusinessCardView *cardView   = [[BusinessCardView alloc] initWithFrame:BUSINESS_FRAME];
        cardView.center              = self.view.center;
        [cardView loadData:adapter];