持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天
设计模式
设计模式是什么
在软件工程中,设计模式是对软件设计中普遍存在的各种问题所提出的解决方案
设计模式并不直接用来完成代码的编写,而是描述在各种不同情况下,要怎么解决问题的一种方案
设计模式能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免会引起麻烦的紧耦合,以增强软件设计面对并适应变化的能力
因此,当我们遇到合适的场景时,我们可能会条件反射一样自然而然想到符合这种场景的设计模式
比如,当系统中某个接口的结构已经无法满足我们现在的业务需求,但又不能改动这个接口,因为可能原来的系统很多功能都依赖于这个接口,改动接口会牵扯到太多文件
因此应对这种场景,我们可以很快地想到可以用适配器模式来解决这个问题
有哪些设计模式
常见的设计模式:
- 单例模式
- 工厂模式
- 策略模式
- 代理模式
- 中介者模式
- 装饰者模式
- ......
单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点。实现的方法为先判断实例存在与否,如果存在则直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象
单例模式(Singleton Pattern):创建型模式,提供了一种创建对象的最佳方式,这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建
在应用程序运行期间,单例模式只会在全局作用域下创建一次实例对象,让所有需要调用的地方都共享这一单例对象
从定义上来看,全局变量好像就是单例模式,但是一般情况我们不认为全局变量是一个单例模式,原因是:
- 全局命名污染
- 不易维护,容易被重写覆盖
工厂模式
工厂模式通常会分成 3 个角色:
- 工厂角色-负责实现创建所有实例的内部逻辑.
- 抽象产品角色-是所创建的所有对象的父类,负责描述所有实例所共有的公共接口
- 具体产品角色-是创建目标,所有创建的对象都充当这个角色的某个具体类的实例
工厂模式是用来创建对象的一种最常用的设计模式,不暴露创建对象的具体逻辑,而是将将逻辑封装在一个函数中,那么这个函数就可以被视为一个工厂
其就像工厂一样重复的产生类似的产品,工厂模式只需要我们传入正确的参数,就能生产类似的产品
工厂模式根据抽象程度的不同可以分为:
- 简单工厂模式(
Simple Factory) - 工厂方法模式(
Factory Method) - 抽象工厂模式(
Abstract Factory)
工厂模式适用场景如下:
- 如果你不想让某个子系统与较大的那个对象之间形成强耦合,而是想运行时从许多子系统中进行挑选的话,那么工厂模式是一个理想的选择
- 将
new操作简单封装,遇到new的时候就应该考虑是否用工厂模式; - 需要依赖具体环境创建不同实例,这些实例都有相同的行为,这时候我们可以使用工厂模式,简化实现的过程,同时也可以减少每种对象所需的代码量,有利于消除对象间的耦合,提供更大的灵活性
策略模式
策略模式,就是定义一系列的算法,把他们一个个封装起来,并且使他们可以相互替换
至少分成两部分:
- 策略类(可变),策略类封装了具体的算法,并负责具体的计算过程
- 环境类(不变),接受客户的请求,随后将请求委托给某一个策略类
策略模式(Strategy Pattern)指的是定义一系列的算法,把它们一个个封装起来,目的就是将算法的使用与算法的实现分离开来
一个基于策略模式的程序至少由两部分组成:
- 策略类,策略类封装了具体的算法,并负责具体的计算过程
- 环境类
Context,Context接受客户的请求,随后 把请求委托给某一个策略类
使用策略模式的优点有如下:
- 策略模式利用组合,委托等技术和思想,有效的避免很多 if 条件语句
- 策略模式提供了开放-封闭原则,使代码更容易理解和扩展
- 策略模式中的代码可以复用
代理模式
代理模式:为对象提供一个代用品或占位符,以便控制对它的访问 例如实现图片懒加载的功能,先通过一张
loading图占位,然后通过异步的方式加载图片,等图片加载好了再把完成的图片加载到img标签里面
代理模式(Proxy Pattern)是为一个对象提供一个代用品或占位符,以便控制对它的访问
代理模式的关键是,当客户不方便直接访问一个对象或者不满足需要时,提供一个替身对象来控制这个对象的访问,客户实际上访问的是替身对象
中介者模式
中介者模式的定义:通过一个中介者对象,其他所有的相关对象都通过该中介者对象来通信,而不是相互引用,当其中的一个对象发生改变时,只需要通知中介者对象即可 通过中介者模式可以解除对象与对象之间的紧耦合关系
装饰者模式
装饰者模式的定义:在不改变对象自身的基础上,在程序运行期间给对象动态地添加方法 通常运用在原有方法维持不变,在原有方法上再挂载其他方法来满足现有需求
Node
简单总结如下:
- 从许多优秀的软件系统中总结出的成功的、能够实现可维护性、复用的设计方案,使用这些方案将可以让我们避免做一些重复性的工作
- 设计模式提供了一套通用的设计词汇和一种通用的形式来方便开发人员之间沟通和交流,使得设计方案更加通俗易懂
- 大部分设计模式都兼顾了系统的可重用性和可扩展性,这使得我们可以更好地重用一些已有的设计方案、功能模块甚至一个完整的软件系统,避免我们经常做一些重复的设计、编写一些重复的代码
- 合理使用设计模式并对设计模式的使用情况进行文档化,将有助于别人更快地理解系统
- 学习设计模式将有助于初学者更加深入地理解面向对象思想