iOS设计模式 - 结构型

2023-03-09  本文已影响0人  iOS资深入门

结构型设计模式

用于处理类或对象的组合

一、桥接模式 - Bridge Pattern

把事物对象和其具体特征分享开来,使它们可以各自独立变化。
圆形三角形归于抽象的形状之下,而画圆画三角归于实现行为的画图之下,然后由形状调用画图
桥接模式是为了实现两个接口结合的多样化而设计的一个模式。目的是为了结合的更好。

桥接模式用于设计的前期,即在设计类时将类规划为逻辑和实现两个大类,是他们可以分别精心深化。

适配器模式用于设计完成之后,当发现设计完成的类无法协同工作时,可以采用适配器模式。
然而很多情况下,在设计初期就要考虑适配器模式的使用,比如在涉及到大量第三方应用接口的情况。

桥接模式UML

二、适配器模式 - AdapterPattern

适配器模式(AdapterPattern)也被称为包装样式或包装。将一个类的接口转换成用户所期待的。一个适配器使得因接口不兼容而不能在一起工作的类能在一起工作。做法是将自己的接口包裹在一个已知类中。

参考:维基百科https://zh.wikipedia.org/wiki/适配器模式

- 例子,方便理解

代码示例(Adapter 也在 Bridge 中)
https://github.com/FMR-Murphy/iOS-Design-Patterns/tree/main/桥接模式%20-%20BridgePattern

三、组合模式 - Compsite Pattern

组合模式使得用户对单个对象和组合对象的使用具有一致性。
将对象组合成树形结构以表示部分、整体的层次结构,又叫部分整体模式,可以用来描述整体和部分的状态。。是用于把一组相似的对象当作单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构模式。它创建了对象组的树形结构。

组合模式UML

- 例子,方便理解
文件系统就是典型的组合模式系统。
示例代码
https://github.com/FMR-Murphy/iOS-Design-Patterns/tree/main/组合模式%20-%20CompositePattern

四、外观模式 - Facade Pattern

为复杂的子系统调用提供一个统一的入口供客户端调用。使子系统更容易使用。


外观模式UML

五、装饰模式 - Decorator Pattern

又叫装饰者模式。装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。
它通过创建一个包装的对象,也就是装饰来包裹真实的对象。但在不需要用到新功能的地方,它可以直接调用原来的类中的方法。装饰类必须有和原来类相同的接口。

装饰模式UML

- 例子,方便理解

六、享元模式 - Flyweight Pattern

使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能的相似物件。它适合用于只是因重复而导致使用无法令人接受的大量内在的大物件。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。
享元模式运用共享技术有效的支持大量细粒度的对象。
内蕴状态存储的内部,不随环境的改变而有所不同,是可以共享。
外蕴状态是不可以共享的,它随环境的改变而改变。因此外蕴状态是由客户端来保持(因为环境的变化是由客户端引起的)。

角色结构

享元模式

- 例子,方便理解
-UILabel等显示本文的时候字体、字号、颜色等文字属性只保存一份。NSAttributedString按索引范围Range保存文字属性。而不是每个字都单独保存一份属性。
-常用的UITableViewCellUICollectionViewCell也是享元模式。需要时从缓存池匹配现有的同类对象,如果找到就直接使用。未找到再创建新对象。

七、代理模式 - Proxy Pattern

对其他对象提供一种代理,以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理的使用可以简单地转发到真实对象,或者可以提供额外的逻辑。在代理中,可以提供额外的功能,例如,当对真实对象的操作是资源密集型时进行缓存,或者在调用对真实对象进行操作之前检查先决条件。对于客户端,使用代理对象与使用真实对象类似,因为两者都实现了相同的接口。

当一个复杂对象的多份副本须存在时,代理模式可以结合享元模式以减少存储器用量。典型作法是创建一个复杂对象,及多个代理者。每个代理者会引用到原来的复杂对象。

在 iOS 中可以使用NSProxy实现多继承

代理模式

需要与delegate进行区分

上一篇 下一篇

猜你喜欢

热点阅读