iOS设计模式 - 装饰
原理图
说明
1. cocoa框架本身实现了装饰模式(category的方式实现了装饰模式)
2. 装饰模式指的是动态的给一个对象添加一些额外的职责,相对于继承子类来说,装饰模式更加灵活
*3. 本人仅仅实现了最简单的装饰模式,装饰器类是一个具体的类,非抽象类
源码
https://github.com/YouXianMing/iOS-Design-Patterns
//
// GamePlay.h
// DecoratorPattern
//
// Created by YouXianMing on 15/8/1.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface GamePlay : NSObject
/**
* 游戏币的数量
*/
@property (nonatomic) NSInteger coin;
/**
* 上下左右的操作
*/
- (void)up;
- (void)down;
- (void)left;
- (void)right;
/**
* 选择与开始的操作
*/
- (void)select;
- (void)start;
/**
* 按钮 A + B 的操作
*/
- (void)commandA;
- (void)commandB;
@end
//
// GamePlay.m
// DecoratorPattern
//
// Created by YouXianMing on 15/8/1.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
//
#import "GamePlay.h"
@implementation GamePlay
- (void)up {
NSLog(@"up");
}
- (void)down {
NSLog(@"down");
}
- (void)left {
NSLog(@"left");
}
- (void)right {
NSLog(@"right");
}
- (void)select {
NSLog(@"select");
}
- (void)start {
NSLog(@"start");
}
- (void)commandA {
NSLog(@"commandA");
}
- (void)commandB {
NSLog(@"commandB");
}
@end
//
// DecoratorGamePlay.h
// DecoratorPattern
//
// Created by YouXianMing on 15/8/1.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "GamePlay.h"
@interface DecoratorGamePlay : NSObject
@property (nonatomic) NSInteger coin;
- (void)up;
- (void)down;
- (void)left;
- (void)right;
- (void)select;
- (void)start;
- (void)commandA;
- (void)commandB;
#pragma mark - 以下为装饰对象新添加的功能
/**
* 剩余几条命
*/
@property (nonatomic, readonly) NSInteger lives;
/**
* 作弊 (上下上下左右左右ABAB)
*/
- (void)cheat;
@end
//
// DecoratorGamePlay.m
// DecoratorPattern
//
// Created by YouXianMing on 15/8/1.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
//
#import "DecoratorGamePlay.h"
@interface DecoratorGamePlay ()
@property (nonatomic, strong) GamePlay *gamePlay;
@end
@implementation DecoratorGamePlay
#pragma mark - 初始化
- (instancetype)init {
self = [super init];
if (self) {
// 装饰对象包含一个真实对象的引用
self.gamePlay = [GamePlay new];
}
return self;
}
#pragma mark - 让真实对象的引用执行对应的方法
- (void)up {
[_gamePlay up];
}
- (void)down {
[_gamePlay down];
}
- (void)left {
[_gamePlay left];
}
- (void)right {
[_gamePlay right];
}
- (void)select {
[_gamePlay select];
}
- (void)start {
[_gamePlay start];
}
- (void)commandA {
[_gamePlay commandA];
}
- (void)commandB {
[_gamePlay commandB];
}
#pragma mark - 装饰器新添加的方法
- (void)cheat {
[_gamePlay up];
[_gamePlay down];
[_gamePlay up];
[_gamePlay down];
[_gamePlay left];
[_gamePlay right];
[_gamePlay left];
[_gamePlay right];
[_gamePlay commandA];
[_gamePlay commandB];
[_gamePlay commandA];
[_gamePlay commandB];
}
@synthesize lives = _lives;
- (NSInteger)lives {
// 相关处理逻辑
return 10;
}
@end
分析
以下是装饰模式实现细节对照图