您的位置:首页 > 其它

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手机。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: