使用Object-C实现23种设计模式之装饰器模式

来源:互联网 发布:巨人网络借壳世纪游轮 编辑:程序博客网 时间:2024/05/07 00:16

谈到装饰器模式,首先先引入一个定义:装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。他是通过创建一个包装对象,也就是装饰来包括真实的对象。

这个定义怎么去理解?首先从定义中提取几个关键词:原类和包装对象。

装饰模式的实现可以采用继承原类,但更好的方法是原类和包装对象实现统一接口(协议),即两者在根源上属于同类。

下面,看这么一个实例,某房地产公司有这么一个制度,开发的房子在客户购买之前一律不装饰,客户交完定金之后开始按照客户意愿进行装饰。

好,接下来,具体分析一下这个例子,在这里,原类即为空房子,包装对象就可以是装饰后的房子,显然,如果装饰后的房子去继承空房子斥于逻辑,所以,在此,我们可以先创建一个房子的接口(协议)House.h,在一些当中去规定一下房子的共有的功能,之后,创建两个类,一个空房子的类(EmptyHouse)和一个装饰后的房子的类(DecoratedHouse),开发商每盖起一栋房子,相当于创建了一个EmptyHouse类的实例,而每装修一个空房子,相当于一个EmptyHouse实例转变成了一个DecoratedHouse实例,但是呢不管是EmptyHouse还是DecoratedHouse,归根结底,根源上都属于House,当然,当中值得一提的是,装修房子的行为是在需要有空房子(可供装修的房子)的基础上进行的。

分析到此,装饰器模式的基本理论已经显而易见了,那么,看代码实现:

首先,House接口,House.h文件:

#import <Foundation/Foundation.h>@protocol House <NSObject>@required-(void)describe;//规定房子的功能@end

接下来,创建EmptyHouse类和DecoratedHouse类两个类,是对House.h协议的具体实现:

EmptyHouse.h

#import <Foundation/Foundation.h>#import "House.h"@interface EmptyHouse : NSObject<House>@end


EmptyHouse.m

#import "EmptyHouse.h"@implementation EmptyHouse-(void)describe{    NSLog(@"这是一个房子!");}@end


DecoratedHouse.h

#import <Foundation/Foundation.h>#import "House.h"#import "EmptyHouse.h"@interface DecoratedHouse : NSObject<House>{    @private NSObject<House>* _house;//引入一个空房子实例,在空房子基础上进行装饰行为}-(instancetype)initWithHouse:(NSObject<House>*)house;//装饰后的房子是建立在空房子的基础上的,所以此处创建该类对象时,应使用空房子实例作为参数@end


DecoratedHouse.m

#import "DecoratedHouse.h"@implementation DecoratedHouse-(instancetype)initWithHouse:(NSObject<House>*)house{    _house = house;    return self;}-(void)describe{    //此处也可为装饰内容    [_house describe];//保持原有的功能不变    NSLog(@"房子里有灯和家具。");//此处应为装饰内容}@end

程序写到这,装饰器模式已经基本完善了,下面,看测试:

main.m

#import <Foundation/Foundation.h>#import "House.h"#import "EmptyHouse.h"#import "DecoratedHouse.h"int main(int argc, const char * argv[]) {    @autoreleasepool {        NSObject<House>* emptyHouse = [[EmptyHouse alloc]init];        NSObject<House>* decoratedHouse = [[DecoratedHouse alloc]initWithHouse:emptyHouse];        [decoratedHouse describe];    }    return 0;}


输出结果:

2016-06-03 11:23:04.014 设计模式之七装饰模式[813:63885]这是一个房子!

2016-06-03 11:23:04.015 设计模式之七装饰模式[813:63885]房子里有灯和家具。

Program ended with exit code: 0


测试成功!

以上为我个人对装饰器模式的简单理解,如有不到之处,敬请指正。

未完待续。。。

0 0
原创粉丝点击