装饰器模式的解析-iOS

栏目: IOS · 发布时间: 5年前

内容简介:1、2、3、

装饰器模式的解析-iOS

其他 设计模式 的介绍

1、 简单工厂模式、工厂模式、抽象工厂模式的解析-iOS

2、 建造者模式的解析-iOS

3、 单例模式的解析-iOS

4、 原型模式的解析-iOS

5、 代理模式的解析-iOS

6、 适配器模式的解析-iOS

7、 装饰器模式的解析-iOS

8、 外观模式的解析-iOS

9、 桥接模式的解析-iOS

10、 组合模式的解析-iOS

概率描述

装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 百度百科

他的设计原则是: 

1、多用组合,少用继承。

种类

1、通过子类实现装饰模式

2、通过分类来实现装饰模式

实用场景

1、需要增加一些基本的功能组成其他的一些功能。

2、需要给一些类添加一些职能 

3、需要给类扩展一些动态(可能会取消)的其他的功能

案例解析

1、通过子类实现装饰模式

作为一名爱吃的女汉子,平常在逛商场的时候,免不了会买一些小吃,尤其是那种杯装的冰淇淋,里面可以放各种坚果配料。我们以这个为例子。坚果的种类我们可以自己组合,我们不可能为每一种组合的坚果创建一个类,如果坚果的种类很多,我们得建立很多的类。所以我们采用装饰者模式,创建一个冰淇淋的基础类,再创建一个坚果类,坚果类继承冰淇凌类,然后再创建集体的坚果,具体的坚果继承坚果类。再使用具体的这样我们有哪几种坚果就创建几个坚果的类。如果再组合成自己想要的样子。这种方式就是我们上面提到的通过子类实现装饰模式。 

具体代码如下: 

冰淇淋类:

//.h文件#import @interface IceCream : NSObject@property(nonatomic,copy)NSString *name;
-(void)content;@end//.m文件#import "IceCream.h"@implementation IceCream- (instancetype)init
{    self = [super init];    if (self) {
        _name = @"冰淇淋";
    }    return self;
}
-(void)content{    NSLog(@"%@ 里面加了 ",_name);
}@end

坚果的类

//.h文件#import "IceCream.h"@interface Nut : IceCream@property(nonatomic,strong)IceCream *iceCream;
- (instancetype)initWithIceCream:(IceCream *)iceCream;@end//.m文件@implementation Nut- (instancetype)initWithIceCream:(IceCream *)iceCream
{    self = [super init];    if (self) {
        _iceCream = iceCream;
    }    return self;
}
-(void)content{    if (self.iceCream) {
        [self.iceCream content];
    }

}@end

具体的坚果类–瓜子

//.h文件#import "Nut.h"@interface MelonSeeds : Nut@end//.m文件#import "MelonSeeds.h"@implementation MelonSeeds-(void)content{
    [super content];    NSLog(@"瓜子");
}@end

具体的坚果类 – 巴达木

//.h文件#import "Nut.h"@interface Bada : Nut@end//.m文件#import "Bada.h"@implementation Bada-(void)content{
    [super content];    NSLog(@"巴达木");
}@end

具体的坚果类 — 开心果

//.h文件#import "Nut.h"@interface PistachioNuts : Nut@end//.m文件#import "PistachioNuts.h"@implementation PistachioNuts-(void)content{
    [super content];    NSLog(@"开心果");
}@end

调用地方

    /**************装饰模式*************************/
    //通过子类实现装饰模式
    IceCream *iceCream = [[IceCream alloc]init];
    Nut *nut = [[Nut alloc]initWithIceCream:iceCream];
    MelonSeeds *melonSeeds = [[MelonSeeds alloc]init];
    Bada *bada = [[Bada alloc]init];
    PistachioNuts *pistachioNuts = [[PistachioNuts alloc]init];
    NSLog(@"第一次组合");    //第一次装扮
    bada.iceCream = nut;
    pistachioNuts.iceCream = bada;
    [pistachioNuts content];
    NSLog(@"\n");

    NSLog(@"\n第一次组合");    //第二次装扮
    pistachioNuts.iceCream = nut;
    melonSeeds.iceCream = pistachioNuts;
    [melonSeeds content];

命令行打印的结果:

2018-06-20 15:31:45.224052+0800 DesignDemo[3035:172018] 第一次组合
2018-06-20 15:31:45.224236+0800 DesignDemo[3035:172018] 冰淇淋 里面加了 
2018-06-20 15:31:45.224386+0800 DesignDemo[3035:172018] 巴达木
2018-06-20 15:31:45.224499+0800 DesignDemo[3035:172018] 开心果
2018-06-20 15:31:45.224595+0800 DesignDemo[3035:172018] 2018-06-20 15:31:45.224691+0800 DesignDemo[3035:172018] 第二次组合
2018-06-20 15:31:45.224793+0800 DesignDemo[3035:172018] 冰淇淋 里面加了 
2018-06-20 15:31:45.224892+0800 DesignDemo[3035:172018] 开心果
2018-06-20 15:31:45.224979+0800 DesignDemo[3035:172018] 瓜子

2、通过分类来实现装饰模式

IceCream类的代码

//.h 文件#import @interface IceCream : NSObject@property(nonatomic,copy)NSString *name;
-(void)content;@end//.m 文件#import "IceCream.h"@implementation IceCream- (instancetype)init
{    self = [super init];    if (self) {
        _name = @"冰淇淋";
    }    return self;
}
-(void)content{    NSLog(@"%@ 里面加了 ",_name);
}@end

IceCream+Bada分类的代码:

//.h文件#import "IceCream.h"@interface IceCream (Bada)-(void)yy_Name;@end//.m文件#import "IceCream+Bada.h"@implementation IceCream (Bada)-(void)yy_Name{    NSLog(@"巴达木");
}@end

调用的代码

    //通过分类来实现装饰
    IceCream *iceCreamTwo = [[IceCream alloc]init];
    [iceCreamTwo content];
    [iceCreamTwo yy_Name];

命令行打印的结果

2018-06-20 16:04:06.472324+0800 DesignDemo[3428:191882] 冰淇淋 里面加了 
2018-06-20 16:04:06.472475+0800 DesignDemo[3428:191882] 巴达木

优缺点

优点:

1、可以通过一些装饰类组合成很多不同的功能 

2、可以扩展类的功能。 

3、适合组件化编程。 

4、如果通过分类的实现装饰模式,减少了继承关系 

缺点: 

1、可能生出更多的类,增加程序的复杂性

总结

如果有写的不正确或者侵权的,希望大家给我提出来,我会及时修改。谢谢大家。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

UNIX编程艺术

UNIX编程艺术

[美] Eric S. Raymond / 姜宏、何源、蔡晓骏 / 电子工业出版社 / 2012-8 / 99.00元

《UNIX编程艺术》主要介绍了Unix系统领域中的设计和开发哲学、思想文化体系、原则与经验,由公认的Unix编程大师、开源运动领袖人物之一Eric S.Raymond倾力多年写作而成。包括Unix设计者在内的多位领域专家也为《UNIX编程艺术》贡献了宝贵的内容。《UNIX编程艺术》内容涉及社群文化、软件开发设计与实现,覆盖面广、内容深邃,完全展现了作者极其深厚的经验积累和领域智慧。一起来看看 《UNIX编程艺术》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

html转js在线工具
html转js在线工具

html转js在线工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具