什么是设计模式?
设计模式是对软件设计中出现的典型问题的常规解决方案。它们就像一个解决典型问题的蓝图,您可以对其进行定制。
我为什么要学习模式?
关于设计模式的好处是,它们是针对常见问题的经过尝试和测试的解决方案。这使您能够以有效的方式解决在程序中遇到的问题,而不必重新发明轮子。如果您和您的团队成员了解模式,它可以帮助提高沟通的效率。
使用模式也有一些缺点。当您了解不同的软件模式时,您可能会尝试实现不需要或不是最佳解决方案的模式。另一个可能的缺点是试图实现一个模式过于字面化,而没有根据项目的上下文对其进行定制。
模式分类
设计模式通常分为三类: 创建模式、结构模式和行为模式。
创建模式描述了创建对象的方法,这些方法可以提高代码重用性和灵活性。
结构模式为如何将对象和类构建成更大的结构提供了模式,同时使它们具有适应性和高效性。
行为模式描述了用于有效通信和对象之间责任委托的模式。
让我们来探索一些更常见的软件设计模式。
工厂法
Factory 方法解决了创建对象时不必指定所创建的确切类的问题。超类定义了一个创建对象的接口,子类实现了创建对象的特定逻辑。
例如,可以引入一个名为 ShapeFactory 的工厂接口,并具有一个名为 createShape 的方法,该方法返回一个 Shape 类型的对象。具体的实现,比如 CircleFactory 和 RectangleFactory,然后将实现 createShape 方法来返回 Circle 和 Recangle 类型的对象。
工厂模式的一个优点是,您可以通过添加新的子类来引入新的类型,而不必破坏现有的代码。
单例
Singleton 是一个只允许一个类有一个实例的创建型模式。要创建一个单例类,类的缺省构造函数需要是私有的。这样可以确保其他类不能调用单例类上的新方法。不要使用缺省构造函数,创建一个静态创建方法。如果不存在对象,此方法将调用私有构造函数,否则将返回已存在的缓存对象。
单例类解决的问题是,它确保一个类只有一个实例,并且可以为该实例提供一个全局访问点。单例类对于缓存、日志记录和注册表等类很有帮助。
建造者
Builder 是一个可以让你一步一步创建复杂对象的创建型模式。这允许使用相同的构造代码来实现不同的类型和表示。
如果存在一个可以有很多变体的类,那么构造函数就会变得非常庞大和混乱。例如,想象一下有很多额外设备(防抱死制动系统,加热座椅,后视摄像头等)的“汽车”类。与其拥有一个包含所有选项的大型汽车构造函数,不如使用构造函数类。构建器类可以有一系列构造汽车不同变体的方法。例如 buildFrame、 addWheels、 addBrakes、 addRearViewCamera 等等。.
构建器模式的优点是,在构建不同的对象时,可以重用相同的构建代码,而且构建代码与产品的业务逻辑是隔离的。
适配器
适配器模式是允许具有不同接口的两个类进行通信的模式。适配器作为类之间的转换器工作,这样它们就可以一起工作。例如,如果一个类输出 XML,而另一个类需要 JSON 输入。然后需要一个适配器来将 XML 转换为 JSON。
代理
代理是一种结构模式,允许您通过创建替代品或占位符来控制对对象的访问。如果存在不总是运行的服务或资源,代理可以处理服务的初始化。这样就不需要在所有使用服务的地方复制初始化代码。
代理模式建议您创建一个具有与原始对象相同接口的新代理类。然后您可以在程序中使用代理对象而不是原始对象。然后,代理将工作委托给原始对象。
使用代理的好处是,您可以控制对原始对象的访问,而且即使原始对象已关闭,代理也可以工作。
状态
状态模式在内部状态更改时处理对象的行为。例如,当对象处于特定状态时,某些行为是不允许的。
状态模式与有限状态机紧密相连。这告诉我们一个程序只能处于一定数量的状态。各个状态的行为不同,并非所有的状态都可以相互转换。
为了创建封装状态之间转换规则和状态行为的逻辑,条件语句(if、 switch 或者模式匹配)是常见的。如果有很多状态,这个逻辑就会变得很大,很难维护。
状态模式通过为每个状态实现类来解决这个问题。每个状态类处理自己的行为和转换到新状态的逻辑。原始对象(也称为上下文)通过用新的状态对象替换活动状态对象来更改状态。所有状态对象都需要遵循一个公共接口。
策略
策略模式允许在一个抽象下对一系列算法进行分组。这允许运行库在算法之间切换。
策略模式与状态模式非常相似。它不处理不同的状态,而是处理不同的算法或策略。
例如,谷歌地图提供了使用汽车、步行、公共交通等方式进行导航的选项。.这些选项使用不同的算法,但都可以在同一个客户机中使用。
策略模式为不同的策略使用通用接口。原来的类变得独立于具体的策略。原始类有一个用于存储策略对象的字段。特定的策略对象负责执行算法。客户端负责选择正确的算法。
使用策略模式的一个优点是,您可以在将来添加额外的算法,而不会使原始类变得混乱。
观察者
观察者是一种描述订阅机制的模式,它允许多个对象在它们观察到的对象发生更改时得到通知。
所观察到的对象通常称为主题或发布者。更改发生时通知的对象称为订阅方。YouTube 就是这种观察者模式的一个例子,每当一个频道发布一个新视频,就会通知关注者。
发布者类应该具有添加和删除订阅者以及通知所有订阅者的方法。所有订阅者都应该具有相同的接口和方法,发布者可以调用这些接口和方法来通知他们更改。通常,发布者有一个订阅者列表,循环访问订阅者,并调用订阅者“ update”方法来通知他们发布者的更改。