iOS常用设计模式综述

2018-03-09  本文已影响29人  石头人R

1-设计模式主要有三种:

2-面向对象设计原则

开闭1.png
开闭2.png

3-创建对象与使用对象-谈谈工厂的作用

  1. 对象相关职责:对象本身所具有的职责/创建对象的职责/使用对象的职责;
  2. 创建对象的方式:

创建型模式

1- 简单工厂模式

简单工厂1.png 简单工厂2.png

优点:

缺点:

2- 工厂方法模式

简单工厂存在严重的问题:当系统中需要引入一个新产品时,由于静态工厂方法通过传入参数的不同创建不同的产品,这必定 要修改工厂的源代码.违背"开闭原则";

工厂方法1.png 工厂方法2.png

组成:

提供一个抽象工厂接口来声明抽象工厂方法,而由其子类来具体实现工厂方法,创建具体的产品对象;即为每一个工厂方法独立出一个类;

优点:

缺点:

3-抽象工厂模式

对工厂方法进一步补充:将一些相关的产品组成一个"产品族",由同一个工厂来统一生产;

产品族 .png

抽象工厂和工厂方法模式的区别:工厂方法模式针对的是一个产品等级结构;而抽象工厂需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建;

抽象工厂1.png 抽象工厂2.png

优点:

缺点:

4-单例模式

结构型模式

1-适配器模式 (AdapterPattern)

组成:

适配器1.png

2-桥接模式 Bridge

如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来使两者可以独立扩展,将抽象部分和它的实现部分分离,使他们都可以独立的变化;

[图片上传失败...(image-1b7b7f-1520597346134)]

- (void)viewDidLoad {
    [super viewDidLoad];
     //
    MessageImplementor *impl = [MessageSMS new];
    AbstractMessage *message = [[CommonMessage alloc] initWithImplementor:impl];
    [message sendMessag:@"加班申请速批" toUser:@"李总"];
    
    //
    impl = [MessageEmail new];
    message = [[UrgencyMessage alloc] initWithImplementor:impl];
    [message sendMessag:@"加班申请速批" toUser:@"李总"];
}

AbstractMessage:

- (void)sendMessag:(NSString *)message toUser:(NSString *)user
{
    [self.impl send:message toUser:user];
}    

3-装饰模式 Decotator

如果是创建UI的时候,将公共部分抽离,不同的部分使用装饰模式装饰后使用;

当不能采用生成子类的方法进行扩充时.一种情况是:可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长.另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类;

优点:比静态继承更加灵活 与对象的静态继承相比,decorator模式提供了更加灵活的向对象添加职责的方式,可以用添加和分离方法,用装饰在运行时刻增加和删除职责,相比之下,继承机制要求为每个添加的职责创建一个新的子类(例如BorderScrollable,TextView,BorderTextView),这会产生许多新的类,并且增加系统的复杂度;此外,为一个特定的component类提供多个不同的decorator类,这就使得你可以对一些职责进行混合和匹配;

组成:

装饰1.png

透明装饰模式: 在透明装饰模式中,要求客户端完全针对抽象编程,装饰模式的透明性要求客户端程序不应该将对象声明为具体构件类型或具体装饰类型,而应该全部声明为抽象构件类型;

Component component,componentSB,componentBB; //全部使用抽象构件定义
component = new Window();
componentSB = new ScrollBarDecorator(component);
componentBB = new BlackBorderDecorator(componentSB);
componentBB.display();      

半透明装饰模式:透明装饰模式的设计难度较大,而且有时我们需要单独调用新增的业务方法。为了能够调用到新增方法,我们不得不用具体装饰类型来定义装饰之后的对象,而具体构件类型还是可以使用抽象构件类型来定义,这种装饰模式即为半透明装饰模式,也就是说,对于客户端而言,具体构件类型无须关心,是透明的;但是具体装饰类型必须指定,这是不透明的。

Document  doc; //使用抽象构件类型定义
doc = new PurchaseRequest();
Approver newDoc; //使用具体装饰类型定义
newDoc = new Approver(doc);  

4- 外观模式 Facade

外观模式是一种使用频率非常高的结构型设计模式,它通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度,且客户端调用非常方便。
eg:

外观1.png

外观模式通过引入一个新的外观类(Facade)来实现该功能,外观类充当了软件系统中的'服务员',它为多个业务类的调用提供了一个统一的入口,简化了类与类之间的交互.那些需要交互的业务被称为子系统;如果没有外观类,那么每个客户类需要和多个子系统之间进行复杂的交互,系统的耦合度将很大;而引入外观类之后,客户类只需要直接与外观类交互,客户类与子系统之间原有的复杂引用关系由外观类来实现,从而降低了系统的耦合度.

将分散的多个子系统接口调用集中到外观类的接口(比如弹框的封装也可以说是用了外观模式:把创建/显示集成到一个接口show中).

5-代理模式

行为型模式

1-观察者模式

定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新.

2-策略模式 strategy

在策略模式中,我们可以定义一些独立的类来封装不同的算法,每一个类封装一种具体的算法,在这里,每一个封装算法的类我们都可以称之为一种策略;
策略模式目的:将算法的定义和使用分开,也就是将算法的行为和环境分开;
[图片上传失败...(image-44220d-1520597346134)]
策略模式结构:

StudentDiscount *discount = [StudentDiscount new];
MovieTicket *ticket = [MovieTicket new];
ticket.price = 200.0;
ticket.discount = discount;
NSLog(@"%f",ticket.price);



@implementation MovieTicket
- (double)price
{
    return [self.discount calculate:_price];
}
@end

3- 状态模式

state(状态模式):允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类;

此模式和策略模式类似,策略模式封装的是算法,而这个封装的是状态;

参考

史上最全设计模式导学目录(完整版)
可复用面向对象软件的基础

上一篇 下一篇

猜你喜欢

热点阅读