headfast设计模式学习笔记02 装饰者

本文深入探讨装饰者模式的应用,通过实例展示如何在不修改现有代码的前提下扩展类的功能,特别适用于需求变化频繁的情况。同时,文章对比了装饰者模式与策略模式、代理模式的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引入设计原则:类应该对扩展开放,对修改关闭


目的:是类容易扩展,在不修改现有代码的情况下,就可以搭配新的行为。

如观察者模式,装饰者模式。


注意:1没必要每个部分都遵循开放-关闭原则,因为一般会引入新的抽象层次,增加代码的复杂度。你需要把注意力集中在设计中最有可能改变的地方然后再用开放-关闭原则。2那么那些最可能改变呢?经验和对工作领域或业务的了解。也就是说,多看,多见识。慢慢你会懂。


例子:咖啡增加各种调理,然后计算价钱。调理的变化度较大。


基本的darkRoast为被装饰者,使用Mocha装饰一次,再用Whip装饰一次。。。计算钱时,使用最外层装饰者Whip的cost方法,以及向里面调用cost。真正计算时从最里面计算返回到最外层

Pasted Graphic 1.tiff

由此例子可以知道

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手机。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值