美文网首页程序员iOS Developer
Objective-C 装饰模式--简单介绍和使用

Objective-C 装饰模式--简单介绍和使用

作者: Jackey_Zhou | 来源:发表于2016-12-27 10:58 被阅读33次

装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

比如游戏机有一个GamePad类, 现在要增加一个作弊功能(例如100条命), 如果直接在GamePad类中去添加可能会影响其他子类的使用

我们考虑装饰模式思维, 先建立一个装饰器实现GamePad的所有功能, 然后在装饰器类的子类中去添加作弊放方法

上代码

比如GamePad类是这样

#import <Foundation/Foundation.h>

@interface GamePad : NSObject

- (void)up;
- (void)down;
- (void)left;
- (void)right;
- (void)buttonA;
- (void)buttonB;

@end

我们创建一个装饰器类, 让它持有一个GamePad实例并实现相同的方法接口

GamePadDecorator.h

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

@interface GamePadDecorator : NSObject

- (void)up;
- (void)down;
- (void)left;
- (void)right;
- (void)buttonA;
- (void)buttonB;

@end

GamePadDecorator.m

#import "GamePadDecorator.h"

@interface GamePadDecorator ()

@property (nonatomic, strong) GamePad *gamePad;

@end

@implementation GamePadDecorator

- (instancetype)init {
    self = [super init];
    if (self) {
        self.gamePad = [[GamePad alloc] init];
    }
    return self;
}

- (void)up {
    [self.gamePad up];
}

- (void)down {
    [self.gamePad down];
}

- (void)left {
    [self.gamePad left];
}

- (void)right {
    [self.gamePad right];
}

- (void)buttonA {
    [self.gamePad buttonA];
}

- (void)buttonB {
    [self.gamePad buttonB];
}

@end

现在我们新增一个子类来实现作弊方法

CheatGamePadDecorator.h

#import "GamePadDecorator.h"

@interface CheatGamePadDecorator : GamePadDecorator

- (void)cheat;

@end

CheatGamePadDecorator.m

#import "CheatGamePadDecorator.h"

@implementation CheatGamePadDecorator

- (void)cheat {
    NSLog(@"cheat");
}

@end

这样我们就可以直接在Controller中直接用CheatGamePadDecorator类去实现GamePad的所有功能还能额外实现作弊方法

#import "ViewController.h"
#import "CheatGamePadDecorator.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //创建CheatGamePadDecorator实例
    CheatGamePadDecorator *cheaterGamePad = [[CheatGamePadDecorator alloc] init];
    
    //实现GamePad的功能
    [cheaterGamePad up];
    [cheaterGamePad down];
    
    //实现作弊方法
    [cheaterGamePad cheat];
}

@end

这样就完成了一个装饰模式思路的代码构建

下面说说cocoa touch中自带的Category, 它也是对装饰模式的一个实现

我们用Category来实现上面GamePad添加作弊功能

我们创建一个Cheat Category

GamePad+Cheat.h

#import "GamePad.h"

@interface GamePad (Cheat)

- (void)cheat;

@end

GamePad+Cheat.m

#import "GamePad+Cheat.h"

@implementation GamePad (Cheat)

- (void)cheat {
    NSLog(@"cheat");
}

@end

这样我们就可以直接在Controller中通过Category来实现上面功能

#import "ViewController.h"
#import "GamePad+Cheat.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //创建GamePad实例
    GamePad *gamePad = [[GamePad alloc] init];
    
    //实现GamePad原有方法
    [gamePad up];
    [gamePad down];
    
    //实现作弊方法
    [gamePad cheat];
    
}

使用Category更为简单

但是在使用Category时有个细节一定要注意, 尽量不要在Category类中去重写基类方法

假如我们在GamePad+Cheat.h中重写了- (void)up方法, 则整个工程中的up方法都被重载了

即使我们不在任何地方引用GamePad+Cheat.h, 只要这个文件在工程里面就会让GamePad方法被重载

相关文章

  • Objective-C 装饰模式--简单介绍和使用

    装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包...

  • Objective-C 外观模式--简单介绍和使用

    外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易...

  • 设计模式-装饰模式

    装饰模式介绍 装饰模式(Decorator Pattern)是结构型设计模式之一,其可以在不改变类文件和使用继承的...

  • 设计模式(七)装饰模式

    1.装饰模式简介 装饰模式介绍 装饰模式是结构型设计模式之一,不必改变类文件和使用继承的情况下,动态地扩展一个对象...

  • Objective-C 原型模式 -- 简单介绍和使用

    用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。Prototype原型模式是一种创建型设计模式,P...

  • 设计模式之结构型模式(下)

    上篇已经介绍了适配器模式、桥接模式和组合模式,这篇将介绍装饰者模式、外观模式、享元模式和代理模式。 装饰者(Dec...

  • Objective-C 观察者模式--简单介绍和使用

    观察者模式(有时又被称为发布-订阅模式) 在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状...

  • 9、结构型模式-装饰器设计模式

    1、如虎添翼的设计模式-装饰器设计模式 简介:讲解-装饰器设计模式介绍和应用场景 装饰器设计模式(Decorato...

  • ES6中 Decorator 和 使用场景

    一、介绍 Decorator,即装饰器,从名字上很容易让我们联想到装饰者模式 简单来讲,装饰者模式就是一种在不改变...

  • Decorator(装饰器)

    一、介绍Decorator,即装饰器,从名字上很容易让我们联想到装饰者模式 简单来讲,装饰者模式就是一种在不改变原...

网友评论

    本文标题:Objective-C 装饰模式--简单介绍和使用

    本文链接:https://www.haomeiwen.com/subject/sbwsvttx.html