面试题答案
一键面试具体场景
假设我们正在开发一个 iOS 应用,该应用需要从不同的数据源获取用户信息,包括本地数据库和远程服务器。本地数据库使用 Core Data 进行数据存储,而远程服务器提供了 RESTful API。
-
适配器模式:
- 我们有一个
UserInfoFetcher
协议,定义了获取用户信息的方法,如fetchUserInfo
。 - 对于本地数据库,我们创建一个
LocalUserInfoAdapter
类,实现UserInfoFetcher
协议,它内部使用 Core Data 相关代码来获取本地用户信息。 - 对于远程服务器,创建
RemoteUserInfoAdapter
类,同样实现UserInfoFetcher
协议,通过网络请求调用 RESTful API 获取远程用户信息。
- 我们有一个
-
策略模式:
- 应用中存在不同的场景需要获取用户信息,例如在用户登录时可能优先从本地获取信息,而在用户资料更新后可能优先从远程获取。
- 创建一个
UserInfoFetchingStrategy
类,它持有一个UserInfoFetcher
类型的属性。 - 提供不同的策略实现类,如
LoginUserInfoFetchStrategy
类,在其fetchUserInfo
方法中,初始化LocalUserInfoAdapter
并调用其fetchUserInfo
方法;UpdateUserInfoFetchStrategy
类,初始化RemoteUserInfoAdapter
并调用其fetchUserInfo
方法。
-
单例模式:
- 为了避免重复创建网络请求实例或 Core Data 相关实例等,我们可以将
RemoteUserInfoAdapter
和LocalUserInfoAdapter
设计为单例。这样可以保证在整个应用中只有一个实例,提高资源利用率和性能。例如,RemoteUserInfoAdapter
类可以通过类方法sharedInstance
来提供唯一实例。
- 为了避免重复创建网络请求实例或 Core Data 相关实例等,我们可以将
结合带来的优势
- 灵活性:策略模式使得在不同场景下可以灵活选择不同的用户信息获取方式,而适配器模式将不同数据源的获取方式进行了统一接口封装,两者结合提高了系统的灵活性。
- 可维护性:适配器模式将不同数据源的实现细节封装起来,策略模式使得不同获取策略的代码分离,便于维护和扩展。单例模式减少了资源的重复创建,使得代码更易于管理。
- 复用性:适配器模式的实现类可以在不同策略中复用,提高了代码的复用性。
代码实现注意要点
- 适配器实现:在适配器类中,要确保正确调用被适配对象(如 Core Data 或网络请求库)的方法,并将结果转换为符合
UserInfoFetcher
协议的格式。 - 策略实现:在策略类中,要正确初始化和调用适配器实例,确保策略逻辑正确。
- 单例实现:在单例类中,要注意线程安全问题,特别是在多线程环境下创建单例实例。可以使用 GCD(Grand Central Dispatch)的
dispatch_once
来确保单例实例只被创建一次。同时,要考虑单例的生命周期管理,避免内存泄漏等问题。