ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

手机软件何时统一:DesignPatterns-Objective-C桥接模式深度解析,抽象与实现独立变化的iOS实战

2026/8/27 15:48:05 拓冰建站 浏览量
手机软件何时统一:DesignPatterns-Objective-C桥接模式深度解析,抽象与实现独立变化的iOS实战 手机软件何时统一DesignPatterns-Objective-C桥接模式深度解析抽象与实现独立变化的iOS实战【免费下载链接】DesignPatterns-Objective-C用 Objective-C 实现《大话设计模式》书中的例子并用一些 Objective-C 的特性对例子的实现加以优化项目地址: https://gitcode.com/gh_mirrors/de/DesignPatterns-Objective-CDesignPatterns-Objective-C 是一个用 Objective-C 实现《大话设计模式》经典例子的开源项目本文以其中第 22 章「手机软件何时统一」为例带你快速理解 Objective-C 桥接模式的核心思想把抽象部分与实现部分分离让两者可以独立变化。无论你是刚入门的 iOS 开发者还是想重构类爆炸代码的老手这篇桥接模式实战指南都能让你少踩很多坑。 一个真实的痛点手机软件为何难以统一想象这样一个需求市面上有 M、N 两个手机品牌每部手机都要预装「通讯录」和「游戏」等软件。如果直接用继承来写品牌 M 的通讯录、品牌 M 的游戏品牌 N 的通讯录、品牌 N 的游戏每加一个品牌或一款新软件类就会成倍增长——2 个品牌 × 2 款软件 4 个类3 个品牌 × 5 款软件就是 15 个类。这就是《大话设计模式》第 22 章手机软件何时统一提出的经典问题变化的两个维度被耦合在了同一个继承体系里。桥接模式Bridge Pattern给出的答案是把「品牌」和「软件」拆成两个独立的维度让它们各自扩展、互不拖累。 桥接模式核心思想用组合代替继承桥接模式的定义是将抽象部分与它的实现部分分离使它们都可以独立地变化。在 Objective-C 中它通常这样落地实现部分→ 用一个protocol协议定义抽象接口抽象部分→ 一个持有该协议对象的属性而不是一个庞大的继承树变化→ 品牌换软件、软件换品牌都只是换一个引用不改一行代码这正是《大话设计模式》强调的设计原则合成/聚合复用原则CARP——尽量使用组合尽量不用继承。 代码结构拆解抽象与实现如何分离项目把桥接模式的示例放在DesignPatterns/Bridge/目录下一共只有 10 个文件结构非常干净实现部分HandsetSoft 协议DesignPatterns/Bridge/HandsetSoft.h定义了软件维度唯一的抽象——只有一个方法protocol HandsetSoft NSObject - (void)run; end任何手机软件只要遵守这个协议就能装进任何品牌的手机。具体软件实现DesignPatterns/Bridge/HandsetAddressList.m运行手机通讯录DesignPatterns/Bridge/HandsetGame.m运行手机游戏抽象部分HandsetBrand 品牌DesignPatterns/Bridge/HandsetBrand.h中品牌类通过属性持有实现而不是继承软件类interface HandsetBrand : NSObject /// 手机软件 property (strong, nonatomic) idHandsetSoft handsetSoft; /// 运行 - (void)run; end这一行idHandsetSoft handsetSoft就是整座桥——抽象部分依赖的是协议抽象而不是某个具体的软件类。具体品牌HandsetBrandM / HandsetBrandNDesignPatterns/Bridge/HandsetBrandM.m与DesignPatterns/Bridge/HandsetBrandN.m的实现几乎一模一样- (void)run { [self.handsetSoft run]; }品牌只负责把运行请求转交给装在我身上的软件。品牌想加什么品牌、软件想加什么功能都互不影响。 运行效果换品牌、换软件都能无缝切换项目的单元测试DesignPatternsTests/Bridge/BridgeTests.m完整演示了这套组合能力HandsetBrand *handsetBrand [[HandsetBrandM alloc] init]; handsetBrand.handsetSoft [[HandsetGame alloc] init]; [handsetBrand run]; handsetBrand.handsetSoft [[HandsetAddressList alloc] init]; [handsetBrand run];可以看到同一部手机M 品牌可以随意更换预装软件品牌 N 同样支持——两个维度真正实现了独立变化。这就是桥接模式带来的统一品牌统一了软件运行入口软件统一了品牌扩展方式。✨ Objective-C 特性加持协议 属性 组合相比《大话设计模式》中 C#/Java 的原始版本这个项目用了几处 Objective-C 特性做了优化非常值得新手学习protocol定义实现抽象比 Java 接口更符合 OC 习惯还支持默认实现和分类扩展strong, nonatomic属性一行声明完成实现对象的持有自动管理内存idHandsetSoft弱类型引用抽象部分完全不感知具体软件类依赖倒置DIP一步到位NSLog直接输出示例聚焦设计思想运行即可验证 桥接模式 vs 继承体系扩展成本对比扩展方式新增 1 个品牌新增 1 款软件总类数3 品牌 × 5 软件纯继承每款软件一个类每品牌一个类15 个桥接模式1 个品牌子类1 个软件类3 5 8 个类数量从M × N降为M N这才是何时统一的真正答案不是让所有软件统一成一个而是让两个变化维度统一解耦。 什么时候该用桥接模式结合本例桥接模式特别适合这些 iOS 开发场景多维度变化的需求如设备类型 × 通信协议、皮肤主题 × 控件样式用继承会类爆炸不希望永久绑定的层次结构运行时可以动态更换实现部分如切换登录方式、切换网络实现接口不稳定的项目底层实现频繁变动但上层的业务抽象保持稳定跨平台/多端代码抽象部分写在核心层实现部分按平台各自提供 小结与延伸阅读DesignPatterns-Objective-C 用不到 30 行核心代码把桥接模式讲得明明白白。记住三个要点抽象与实现分离一个protocol就是那座桥组合优于继承用属性持有实现而非层层继承独立变化是目标两个维度各自扩展成本从 M×N 降到 MN这个开源仓库还实现了《大话设计模式》中的单例、策略、工厂方法、原型、状态、外观等 12 个模式全部配有单元测试非常适合作为 iOS 设计师的模式图鉴逐一研读。项目根目录的 README 整理了设计模式六大基本原则与 23 种模式的完整清单建议收藏。 新手提示学桥接模式最快的方式就是先亲手把纯继承版写出来数一数类再重构成桥接版——体感会非常深刻。【免费下载链接】DesignPatterns-Objective-C用 Objective-C 实现《大话设计模式》书中的例子并用一些 Objective-C 的特性对例子的实现加以优化项目地址: https://gitcode.com/gh_mirrors/de/DesignPatterns-Objective-C创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考