使用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
测试成功!
以上为我个人对装饰器模式的简单理解,如有不到之处,敬请指正。
未完待续。。。
- 使用Object-C实现23种设计模式之装饰器模式
- 使用Object-C实现23种设计模式之工厂方法模式
- 使用Object-C实现23种设计模式之抽象工厂模式
- 使用Object-C实现23种设计模式之建造者模式
- 使用Object-C实现23种设计模式之单例模式
- 使用Object-C实现23种设计模式之原型模式
- 使用Object-C实现23种设计模式之适配器模式
- 23种设计模式之装饰模式
- C#--设计模式之装饰者模式
- 设计模式之装饰模式(C++实现)
- 设计模式之装饰模式Java实现
- 设计模式之装饰器模式(C++)
- 《大话设计模式》java实现之装饰器模式
- 设计模式之装饰器
- 设计模式之装饰器
- 设计模式之装饰器
- 设计模式---装饰器模式(C++实现)
- 23设计模式之装饰模式(Decorator)
- JAX-WS与JAX-RS比较分析及与SpringMVC集成实现
- System.currentTimeMillis()计算方式与时间的单位转换
- SICP banksystem
- 【java并发】线程同步工具Semaphore的使用
- TCP滑动窗口机制
- 使用Object-C实现23种设计模式之装饰器模式
- 文件和文件夹 REST API 引用
- Unix时间戳(Unix timestamp)及其他时间标准
- ajax异步上传图片
- wordpress 安装后台模版 无法定位问题
- 品类父子品类枚举
- thinkphp查询一周内的新闻排行10条
- spring schedule定时任务(二):配置文件的方式
- getsupportfragmentmanager 没有这个方法