IOS设计模式第三篇之外观设计模式

简介: 外观设计模式: 这个外观设计模式提供了一个单独的接口给复杂的子系统。而不是暴露用户的一组类和API,你仅仅暴露一个简单的同一的API。 下面的图片解释这个概念: API的用户根本不知道后面系统的复杂性。

外观设计模式:

这个外观设计模式提供了一个单独的接口给复杂的子系统。而不是暴露用户的一组类和API,你仅仅暴露一个简单的同一的API。

下面的图片解释这个概念:

Image

API的用户根本不知道后面系统的复杂性。这种模式是理想的在处理大量的类,特别是当他们复杂的使用或者很难理解的时候。

这个外观设计模式使用系统的接口和你隐藏的实现来分离代码。他也减少了依赖外部代码的子系统运作。这也是有用的如果在外观设计模式的类可能会改变,外部类可以保留相同的API同时改变幕后的事情。

例如有一天你可能想替换你的服务器端,你不需要改变代码因为你API没有改变。

怎么使用外观设计模式

当前你有PersistencyManager 来保存专辑数据在本地并且HTTPClient 可以处理远程通信。A项目中其他的类不需要注意这个逻辑。

为了实现这个设计模式,仅仅libraryAPI应该拥有PersistencyManager 和HTTPClient的实例。然后libraryAPI将要暴露简单的API来访问这些服务。

通常一个单例在应用的生命周期只存在一个实例。你不能在单例里面保持太多的强引用指针给其他对象,因为知道应用关闭才能释放。如下图:

Image(1)

libraryAPI将要暴露给其他代码,但是隐藏HTTPClient 和PersistencyManager 来自应用程序的其余部分复杂性。

打开LibraryAPI.h 添加导入头文件:

下一步,添加下面方法定义:

- (NSArray*)getAlbums;

- (void)addAlbum:(Album*)album atIndex:(int)index;

- (void)deleteAlbumAtIndex:(int)index;

现在这些都是你会暴露于其他类的方法

在libraryAPI实现文件里导入下面两个头文件:

#import "PersistencyManager.h"#import "HTTPClient.h"

这将是你导入这些类的唯一地方。记住:你的API将是进入你复杂系统的唯一入口点。

现在添加一些私有实例变量在延展在实现文件里面@implementation后面。

@interface LibraryAPI () {

    PersistencyManager *persistencyManager;

    HTTPClient *httpClient;

    BOOL isOnline;

}

@end

isOnline 决定是否应该响应更新服务器的任何更改到专辑列表如添加或删除专辑。

你 现在需要初始化实例变量在init方法里面,添加以下代码:

- (id)init

{

    self = [super init];

    if (self) {

        persistencyManager = [[PersistencyManager alloc] init];

        httpClient = [[HTTPClient alloc] init];

        isOnline = NO;

    }

    return self;

}

这个HTTP 客户端实际上并不使用一个真正的服务器,只是来演示使用外观设计模式。因此isOnline将要一直是no。

然后添加下面三个方法在实现文件里:

- (NSArray*)getAlbums

{

    return [persistencyManager getAlbums];

}

- (void)addAlbum:(Album*)album atIndex:(int)index

{

    [persistencyManager addAlbum:album atIndex:index];

    if (isOnline)

    {

        [httpClient postRequest:@"/api/addAlbum" body:[album description]];

    }}

- (void)deleteAlbumAtIndex:(int)index

{

    [persistencyManager deleteAlbumAtIndex:index];

    if (isOnline)

    {

        [httpClient postRequest:@"/api/deleteAlbum" body:[@(index) description]];

    }}

看下addAlbum:atIndex:. 这个类第一次更新本地数据,并且如果没有网络链接他更新这个远程服务器。这个是外观设计模式的本质;当系统的其他类添加新专辑时候,不需要知道子系统实现的复杂性。

注意:当用外观设计模式来设计你的子系统时候记住什么也不能阻止客户端直接访问这些隐藏的类。不要吝啬防守的代码不要认为所有的客户一定会使用外观设计模式来使用他们。

编译运行你的应用。你将要看到一个黑色的屏幕。

我们将要需要一些东西展示专辑的数据在屏幕上,这是下一个设计模式的很好的用处。装饰设计模式。

来自英文教程翻译谢绝转载!!!未经允许不得转载维权必究!!!

相关文章
|
10天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
12天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
5天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
17 1
|
28天前
|
设计模式 Java Kotlin
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。对于快速学习Kotlin语法,推荐查看“简洁”系列教程。本文重点介绍了构建者模式在Kotlin中的应用与改良,包括如何使用具名可选参数简化复杂对象的创建过程,以及如何在初始化代码块中对参数进行约束和校验。
19 3
|
2月前
|
设计模式 算法 安全
设计模式——模板模式
模板方法模式、钩子方法、Spring源码AbstractApplicationContext类用到的模板方法
设计模式——模板模式
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
2月前
|
设计模式 Java Spring
spring源码设计模式分析-代理设计模式(二)
spring源码设计模式分析-代理设计模式(二)
|
30天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
33 0
|
2月前
|
设计模式 Java
Java设计模式-工厂方法模式(4)
Java设计模式-工厂方法模式(4)