iOS 设计模式之十一(外观模式)

一、概念

1、外观模式的动机

​ 在外地工作的人经常搓馆子,在饭店吃饭和在家里吃饭的区别:如果在家里做饭,你需要买菜、洗菜、切菜、炒菜等一系列步骤,才能吃饭;而在饭店吃饭,你只需要跟服务员说明你想吃的菜,饭店就把菜给你做好。整个吃饭过程,你只需要和服务员交互即可,整个过程非常简单省事。

​ 在软件开发中,有时候为了完成一项较为复杂的功能,一个客户类需要和多个业务类交互,而这些需要交互的业务类经常会作为一个整体出现,由于涉及到的类比较多,导致使用时代码较为复杂,此时,特别需要一个类似服务员一样的角色,由它来负责和多个业务类进行交互,而客户类只需与该类交互。

2、外观模式的定义

外观模式(Facade Pattern):为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

​ 外观模式又称为门面模式,它是一种对象结构型模式。外观模式是迪米特法则的一种具体实现,通过引入一个新的外观角色可以降低原有系统的复杂度,同时降低客户类与子系统的耦合度。

3、外观模式的2个角色

1)Facade(外观角色):在客户端可以调用它的方法,在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理。

2)SubSystem(子系统角色):在软件系统中可以有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;每一个子系统都可以被客户端直接调用,或者被外观角色调用,它处理由外观类传过来的请求;子系统并不知道外观的存在,对于子系统而言,外观角色仅仅是另外一个客户端而已。

4、结构图
外观模式

二、示例

​ 外观模式中所指的子系统是一个广义的概念,它可以是一个类、一个功能模块、系统的一个组成部分或者一个完整的系统。

1)先创建三个类AppleCompany、HuaWeiCompany和XiaoMiCompany,表示子系统角色;

2)然后创建一个PhoneStore类,拥有上述三个类的实例,方便调用三个公司的方法,表示外观角色;

AppleCompany、HuaWeiCompany和XiaoMiCompany类:

// AppleCompany
@interface AppleCompany : NSObject
- (void)sellIphones;
@end
@implementation AppleCompany
- (void)sellIphones {
    NSLog(@"售卖苹果手机");
}
@end

// HuaWeiCompany
@interface HuaWeiCompany : NSObject
- (void)sellHuaWeiPhones;
@end
@implementation HuaWeiCompany
- (void)sellHuaWeiPhones {
    NSLog(@"售卖华为手机");
}
@end

// XiaoMiCompany
@interface XiaoMiCompany : NSObject
- (void)sellXiaoMiPhones;
@end
@implementation XiaoMiCompany
- (void)sellXiaoMiPhones {
    NSLog(@"售卖小米手机");
}
@end

PhoneStore类:

// .h文件
@interface PhoneStore : NSObject
- (void)sellAllPhones;
@end

// .m文件
@interface PhoneStore ()
@property(nonatomic, strong) AppleCompany *apple;
@property(nonatomic, strong) HuaWeiCompany *huaWei;
@property(nonatomic, strong) XiaoMiCompany *xiaoMi;
@end

@implementation PhoneStore
- (instancetype)init
{
    self = [super init];
    if (self) {
        _apple = [AppleCompany new];
        _huaWei = [HuaWeiCompany new];
        _xiaoMi = [XiaoMiCompany new];
    }
    return self;
}

- (void)sellAllPhones {
    [self.apple sellIphones];
    [self.huaWei sellHuaWeiPhones];
    [self.xiaoMi sellXiaoMiPhones];
}
@end

运行代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    PhoneStore *store = [PhoneStore new];
    [store sellAllPhones];
}

打印结果:

售卖苹果手机
售卖华为手机
售卖小米手机

三、总结

​ 外观模式是一种使用频率非常高的设计模式,它通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,使子系统与客户端的耦合度降低,且客户端调用非常方便。外观模式并不给系统增加任何新功能,它仅仅是简化调用接口。所有涉及到与多个业务对象交互的场景都可以考虑使用外观模式进行重构。

1、优点

1、它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。通过引入外观模式,客户端代码将变得很简单,与之关联的对象也很少。

2、它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可。

3、一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。

2、缺点

1、不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性。

2、如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则。

3、适用场景

1、当要为访问一系列复杂的子系统提供一个简单入口时可以使用外观模式。

2、客户端程序与多个子系统之间存在很大的依赖性。引入外观类可以将子系统与客户端解耦,从而提高子系统的独立性和可移植性。

3、在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。

4、iOS应用举例

​ 比如AFNetworking对于NSURLSession的不同系统版本的处理,利用外观模式提供一个统一的接口。

Demo地址:iOS-Design-Patterns

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容

  • 【学习难度:★☆☆☆☆,使用频率:★★★★★】直接出处:外观模式梳理和学习:https://github.com/...
    BruceOuyang阅读 640评论 0 0
  • 目录 本文的结构如下: 什么是外观模式 模式的结构 代码示例 优点和缺点 适用环境 模式应用 模式扩展 补充 一、...
    w1992wishes阅读 638评论 0 1
  • 1 场景问题# 1.1 生活中的示例## 外观模式在现实生活中的示例很多,比如:组装电脑,通常会有两种方案。 一个...
    七寸知架构阅读 6,237评论 7 57
  • 区块链是地狱,它的时间密度是24小时不间断无节假日,365天无休,这个世界很敏感有什么风吹草动都能来个瀑布、来个...
    狂奔_ab2e阅读 125评论 0 0
  • 我以前觉得喜欢一个人不应该没有尊严。至少我们应该是平等的,有来有往吧。可是,真正当我喜欢一个人,我发现,一种感情...
    养猪的刘大哥阅读 408评论 0 3