headfast设计模式学习笔记02 装饰者
2015-04-02 10:55
417 查看
引入设计原则:类应该对扩展开放,对修改关闭
目的:是类容易扩展,在不修改现有代码的情况下,就可以搭配新的行为。
如观察者模式,装饰者模式。
注意:1没必要每个部分都遵循开放-关闭原则,因为一般会引入新的抽象层次,增加代码的复杂度。你需要把注意力集中在设计中最有可能改变的地方然后再用开放-关闭原则。2那么那些最可能改变呢?经验和对工作领域或业务的了解。也就是说,多看,多见识。慢慢你会懂。
例子:咖啡增加各种调理,然后计算价钱。调理的变化度较大。
基本的darkRoast为被装饰者,使用Mocha装饰一次,再用Whip装饰一次。。。计算钱时,使用最外层装饰者Whip的cost方法,以及向里面调用cost。真正计算时从最里面计算返回到最外层
由此例子可以知道
1装饰者和被装饰者有相同的超类
2可以用多个装饰者包装一个对象
3可以用被装饰过得对象代替任何原始对象(被包装的),因为他们具有相同的超类。
4对象可以任何时候被装饰,
引出定义:
装饰者模式动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案,
找到demo后跟着写完大概有个明白的意思,返回来和策略模式对比,
策略是原来的事物Duck有个fly的组件(接口)变化大,使用FlyInterface类生成对应组件,填到Duck的FLy空中。
装饰者是原来的事物Phone有个通信模块(装饰者)变化大,但是原来事物没有通信模块(接口),使用装饰者Decorator类生成新的GPSDecorator,而Decorator都是Phone的子类,GpsDecorator需要有被其装饰的对象,装饰完成后,GPSDecorator即为需要的新的对象。
目前使用觉得别扭,因为最后目标得出的是一个带源对象的装饰者对象。
但是网上些人不理解装饰者和代理模式的区别。我更费解他们俩有啥联系。再理解。
下面附代码:
抽象类被装饰者;
@interface AbstractCellPhone :
NSObject
- (NSString*)callNumber;
- (NSString*)sendMessage;
@end
@implementation AbstractCellPhone
- (NSString*)callNumber
{
return@"phone call somebody.";
}
- (NSString*)sendMessage
{
return@"phone send a message to somebody.";
}
@end
被装饰者子类
@interface NokiaPhone :AbstractCellPhone
@end
@implementation NokiaPhone
- (NSString*)callNumber
{
return@"NokiaPhone call somebody";
}
- (NSString*)sendMessage
{
return@"NokiaPhone send message to somebody";
}
@end
装饰者类;
@interface Decorator :AbstractCellPhone
{
AbstractCellPhone *abstractCellPhone;
}
- (void)setComponets:(AbstractCellPhone *)cellPhone;
@end
@implementation Decorator
- (void)setComponets:(AbstractCellPhone *)cellPhone
{
abstractCellPhone = cellPhone;
}
- (NSString*)callNumber
{
returnabstractCellPhone.callNumber;
}
- (NSString*)sendMessage
{
returnabstractCellPhone.sendMessage;
}
@end
装饰者的子类
#import "Decorator.h"
@interface DecoratorGPS :
Decorator
@end
#import "DecoratorGPS.h"
@implementation DecoratorGPS
- (NSString *)callNumber
{
return [NSStringstringWithFormat:@"%@
with GPS.",[supercallNumber]];
}
- (NSString *)sendMessage
{
return [NSStringstringWithFormat:@"%@
with GPS.",[supersendMessage]];
}
使用:
AbstractCellPhone *phone = [[AbstractCellPhone alloc]init];
NSLog(@"%@",[phone callNumber]);
NSLog(@"%@",[phone sendMessage]);
DecoratorGPS *GPS = [[DecoratorGPS alloc]init];
[GPS setComponets:phone];
NSLog(@"%@",[GPS callNumber]);
NSLog(@"%@",[GPS sendMessage]);
NokiaPhone *nokia = [[NokiaPhone alloc]init];
NSLog(@"%@",[nokia callNumber]);
[GPS setComponets:nokia];
NSLog(@"%@",[GPS callNumber]);
就是说使用GPS装饰了Nokia手机,得到的一个GPSNokia手机。
目的:是类容易扩展,在不修改现有代码的情况下,就可以搭配新的行为。
如观察者模式,装饰者模式。
注意:1没必要每个部分都遵循开放-关闭原则,因为一般会引入新的抽象层次,增加代码的复杂度。你需要把注意力集中在设计中最有可能改变的地方然后再用开放-关闭原则。2那么那些最可能改变呢?经验和对工作领域或业务的了解。也就是说,多看,多见识。慢慢你会懂。
例子:咖啡增加各种调理,然后计算价钱。调理的变化度较大。
基本的darkRoast为被装饰者,使用Mocha装饰一次,再用Whip装饰一次。。。计算钱时,使用最外层装饰者Whip的cost方法,以及向里面调用cost。真正计算时从最里面计算返回到最外层
由此例子可以知道
1装饰者和被装饰者有相同的超类
2可以用多个装饰者包装一个对象
3可以用被装饰过得对象代替任何原始对象(被包装的),因为他们具有相同的超类。
4对象可以任何时候被装饰,
引出定义:
装饰者模式动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案,
找到demo后跟着写完大概有个明白的意思,返回来和策略模式对比,
策略是原来的事物Duck有个fly的组件(接口)变化大,使用FlyInterface类生成对应组件,填到Duck的FLy空中。
装饰者是原来的事物Phone有个通信模块(装饰者)变化大,但是原来事物没有通信模块(接口),使用装饰者Decorator类生成新的GPSDecorator,而Decorator都是Phone的子类,GpsDecorator需要有被其装饰的对象,装饰完成后,GPSDecorator即为需要的新的对象。
目前使用觉得别扭,因为最后目标得出的是一个带源对象的装饰者对象。
但是网上些人不理解装饰者和代理模式的区别。我更费解他们俩有啥联系。再理解。
下面附代码:
抽象类被装饰者;
@interface AbstractCellPhone :
NSObject
- (NSString*)callNumber;
- (NSString*)sendMessage;
@end
@implementation AbstractCellPhone
- (NSString*)callNumber
{
return@"phone call somebody.";
}
- (NSString*)sendMessage
{
return@"phone send a message to somebody.";
}
@end
被装饰者子类
@interface NokiaPhone :AbstractCellPhone
@end
@implementation NokiaPhone
- (NSString*)callNumber
{
return@"NokiaPhone call somebody";
}
- (NSString*)sendMessage
{
return@"NokiaPhone send message to somebody";
}
@end
装饰者类;
@interface Decorator :AbstractCellPhone
{
AbstractCellPhone *abstractCellPhone;
}
- (void)setComponets:(AbstractCellPhone *)cellPhone;
@end
@implementation Decorator
- (void)setComponets:(AbstractCellPhone *)cellPhone
{
abstractCellPhone = cellPhone;
}
- (NSString*)callNumber
{
returnabstractCellPhone.callNumber;
}
- (NSString*)sendMessage
{
returnabstractCellPhone.sendMessage;
}
@end
装饰者的子类
#import "Decorator.h"
@interface DecoratorGPS :
Decorator
@end
#import "DecoratorGPS.h"
@implementation DecoratorGPS
- (NSString *)callNumber
{
return [NSStringstringWithFormat:@"%@
with GPS.",[supercallNumber]];
}
- (NSString *)sendMessage
{
return [NSStringstringWithFormat:@"%@
with GPS.",[supersendMessage]];
}
使用:
AbstractCellPhone *phone = [[AbstractCellPhone alloc]init];
NSLog(@"%@",[phone callNumber]);
NSLog(@"%@",[phone sendMessage]);
DecoratorGPS *GPS = [[DecoratorGPS alloc]init];
[GPS setComponets:phone];
NSLog(@"%@",[GPS callNumber]);
NSLog(@"%@",[GPS sendMessage]);
NokiaPhone *nokia = [[NokiaPhone alloc]init];
NSLog(@"%@",[nokia callNumber]);
[GPS setComponets:nokia];
NSLog(@"%@",[GPS callNumber]);
就是说使用GPS装饰了Nokia手机,得到的一个GPSNokia手机。
相关文章推荐
- headfast设计模式学习笔记01
- 设计模式学习笔记02
- 设计模式学习笔记之 装饰者模式
- 【学习笔记javascript设计模式与开发实践(装饰者模式)----15】
- 设计模式学习笔记--装饰者模式(Decorator Pattern)
- HeadFir st 设计模式学习笔记11——状态模式
- C++设计模式学习笔记二:装饰者模式
- <JAVA学习笔记二>——设计模式之装饰者设计模式
- 设计模式学习笔记之装饰者模式
- 设计模式---装饰者模式(学习笔记)
- 《设计模式:基于C#的工程化实现及扩展》学习笔记 02 准备篇 -- Namespace(命名空间)
- (Head First 设计模式)学习笔记(3) --装饰者模式(StarBuzz咖啡店实例)
- HeadFir st 设计模式学习笔记21-- 解释者(Inter pr eter)模式拾零
- 《Head First 设计模式》学习笔记:装饰者模式
- android设计模式学习笔记02--组合模式
- HeadFir st 设计模式学习笔记18--中介者(M ediator)模式拾零
- 设计模式学习笔记02
- 设计模式学习笔记之装饰者模式
- (Head First 设计模式)学习笔记(3) --装饰者模式(StarBuzz咖啡店实例)