欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【译】设计模式教程--OOP的能力

程序员文章站 2022-06-21 19:22:28
黑客技术点击右侧关注,了解黑客的世界!Java开发进阶点击右侧关注,掌握进阶之路!Python开发点击右侧关注,探讨技术话题!原文链接:medium.com/swift-......

【译】设计模式教程--OOP的能力

黑客技术

点击右侧关注,了解黑客的世界!

【译】设计模式教程--OOP的能力

【译】设计模式教程--OOP的能力

Java开发进阶

点击右侧关注,掌握进阶之路!

【译】设计模式教程--OOP的能力

【译】设计模式教程--OOP的能力

Python开发

点击右侧关注,探讨技术话题!

【译】设计模式教程--OOP的能力

原文链接:medium.com/swift-india…

作者丨Hitendra Solanki

【译】设计模式教程--OOP的能力

导读--本博客系列要求具有面向对象编程的中级专业知识。您应该对类、对象、构造函数、继承、值和引用类型有基本的了解。通过仔细地从头到尾阅读本系列文章,不管是中级还是高级开发,您都将有所收获。

设计模式用于表示经验丰富的面向对象软件开发人员社区采用的最佳实践。

建造者模式帮助我们更简单更易读地创建一个类,它遵守着以下两条规则:

1、分割原始类和它的构造方法

2、在最后一个返回类的实例

建造者模式最佳的例子就是SwiftUI,是的你没有看错。SwiftUI中大部分类像是Text,Image都是使用的建造者模式。

问题

想一下,一个Person类拥有不少于十个属性,当你要使用它时,你需要为它创建一个构造方法。它的构造者将拥有不少于十个参数,去管理这么一个带有很多参数的单一函数或构造方式将是非常困难的,最终你也会让这端代码失去可读性。看下面的例子:


将上面的例子在playground中运行一下,你会得到预期结果。逻辑上这也是对的。

我们可以尝试优化上面的代码,从解决这两个问题入手。

1、我们必须按照既定的顺序传参数,而不能通过重新排列参数提高可读性。

2、即使创建对象时我们不知道一些属性值,我们也不得不传入所有参数。

例如你需要创建一个Person类,但是这个人还在找工作。只有当他进入某一公司我们才能得到他的工作信息。

解决方案:

1、创建相关属性的逻辑分组。

2、为不同分组的属性创建不同的建造者类。

3、在建造者类中最后一步返回实例。

让我们从上面的例子开始,我们已经拥有一个Person类,它含有14个属性。我们仔细观察这14个属性,可以将它分为四组。1、个人信息

2、联系方式

3、地址信息

4、公司信息

通过强大的设计模式我们可以解决上面两个问题,具体代码如下:


在上面的例子中,我们把Person类根据职责分割成了几个不同的类。我们创建了多个建造者,他们分别管理相关分组内的属性,而Person只持有这些建造者。

我们拥有一个建造者基类PersonBuilder和四个衍生的建造者类,

PersonPersonalDetailsBuilder, PersonContactDetailsBuilder, PersonAddressDetailsBuilder

PersonCompanyDetailsBuilder

当其他四个从Personbuilder衍生出来的建造者需要更新相关属性时,Personbuilder这个基类可以帮助我们在它们之间进行转换。

在上面的例子中我们可以看到新的构造方法变得更加易读了,我们可以用一种更加优雅的方式更新一组或者某一个属性。

需要注意一下,上面的例子中我们再每个建造者更新方法之后返回了它自己。这让我们能够在相同的建造者中写出链式方法,而不是分开的多行。这个概念称为流程模式。

优点

1、用一种优雅的方式很容易地初始化一个含很多参数的类。

2、遵从单一职责原则。

3、根据你的情况,以任意的顺序初始化对象和更新属性。

作者丨zhangferry链接:

https://juejin.im/post/5d65f5d8e51d4557dc774ed5来源丨掘金

 推荐↓↓↓ 

【译】设计模式教程--OOP的能力

?16个技术公众号】都在这里!

涵盖:程序员大咖、源码共读、程序员共读、数据结构与算法、黑客技术和网络安全、大数据科技、编程前端、Java、Python、Web编程开发、Android、iOS开发、Linux、数据库研发、幽默程序员等。

【译】设计模式教程--OOP的能力

万水千山总是情,点个 “在看” 行不行

本文地址:https://blog.csdn.net/olsQ93038o99S/article/details/100549811