Single01-设计模式

读书笔记

0x01 基础知识

模式:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心,通过这种方式,我们可以无数次重用那些已有的成功的解决方案,无须重复相同的工作

a pattern is a successful or efficient solution to a recurring problem within a context!

设计模式 一般包含模式名称、问题、目的、解决方案和效果等组成要素,其中关键要素是模式名称、问题、解决方案和效果

  • pattern name:通过一两个词来描述模式的问题、解决方案和效果,便于更好的理解模式并方便开发人员之间的交流
  • Problem:描述了应该在何时使用模式,包含了在设计中存在的问题以及问题存在的原因
  • Solution:描述设计模式的组成成分,以及这些组成成分之间的相互关系,各自的职责和协作方式,通常解决方案通过UML类图和核心代码来进行描述
  • Consequences:描述了模式的优缺点以及在使用模式应该权衡的问题

模式的分类主要分为creational、structural、behavioral三种

  • creational:描述如何创建对象
  • structural:主要用于描述如何实现类或对象的组合
  • behavioral:描述类或对象怎么交互以及怎么分配职责

设计模式的作用

可以实现可维护复用的设计方案,使用这些方案可以让我们避免做一些重复性的工作,有助于帮助我们提高开发和设计效率,同时提供了一套通用的设计词汇和一种通用的形式来方便开发人员之间沟通和交流、使得设计方案更加通俗易懂,大部分设计模式都兼顾了系统的可重用性和可拓展性,这使得我们可以更好地重用一些已有的设计方案、功能模块甚至一个晚还在呢个的软件下系统,避免做一些重复的设计(donnot repeat your code)

面向对象

面向对象的软件系统的设计,在支持可维护性的同时,提高系统的可复用性是一个至关重要的问题,如何同时提高一个软件系统的可维护性和可复用性是面向对象设计需要解决的核心问题之一,常见的面向对象的具有一下的设计原则

单一职责原则 single responsibility principle

一个类之负责一个功能领域总的相关职责,或者可以定义为,就一个类而言,应该只有一个引起他变化的原因;在软件系统中,一个类承担的职责越多,它被复用的可能性就越小

开闭原则 open closed principle

一个软件实体应该对拓展开发,对修改关闭,软件实体应尽量在不修改原有代码情况下进行拓展

为了满足开闭原则饿,需要对系统进行抽象化设计,抽象化是开闭原则饿的关键

1
2
3
4
5
6
7
8
9
10
11
12
13
// display 方法
if(type.equals('pie'){
pieCHart chart=new PieChart()
chart.display();
}
else if (type.equals('bar')){
barChart chart=new BarChart();
chart.dispaly();
})
// 但是这种方法中,如果需要增加一个新的图表类,比如折线图lineChart,就需要修改chartdisplay的源代码,增加判断逻辑违反了开闭原则
//重构代码,需要通过抽象化的方式来对系统进行冲个,使之增加新的图表时不需要修改源代码
1. 增加一个抽象图表类AbstractChart 将使用各种具体图表类作为子类
2. chartdisplay类针对抽象图表类进行编程,由客户端来决定使用那种具体图表
里氏代换原则 liskov substitution principle

所有引用父类的地方必须能透明地使用其子类的对象

里氏代换原则是实现开闭原则的重要

在软件中将一个基类对象替换成为子类对象,程序将不会出现任何错误和异常,需要注意的问题有

  1. 子类的所有防范必须在弗雷中生命,为了保证系统的拓展性,在程序通常使用parent class来进行定义
  2. 尽量把parent class设计为抽象类或者借口,让sub class继承parent class或者实现parent class借口
依赖倒转原则 dependence inversion principle

抽象不应该依赖于细节,细节应当以来于抽象

要求我们在程序代码中传递参数或者在关联关系汇总,尽量引用层次高的抽象层类,使用接口和抽象类进行变量类型生命、参数类型生命、方法返回类声明以及数据类型的转换,而不是要用具体类来做这些事情

接口隔离原则 interface segregation principle

使用多个专门的接口,而不是使用单一的总结口

接口不能太小,太小造成数量太多难以维护,接口不能太大,太小违反接口隔离的原则

合成复用原则 composite reuse principle

尽量使用对象组合,而不是继承来达到复用的目的,是在一个新的对象例通过关联关系来使用一些已有的对象,使之成为新对象的一部分,新对象通过委派调用已有对象的方法达到复用功能的目的

迪米特法则 law of Demeter

一个软件实体应该尽可能减少和其他实体发生相互作用

0x02 六种 创建模式

2.1 简单工厂模式

首先将需要创建的各种不同对象的相关代码封装到不同的类中,这种类称之为具体产品类,而 将他们的公共的代码进行抽象和提取后封装在一个抽象产品类中,每一个具体产品类都是抽象产品类的子类,然后提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据所传入的参数不同创建不同的具体产品对象,客户端只需要调用工程类的工厂方法并传入响应的参数就可以得到一个产品对象

0x03 七种 结构模式

0x04 十一种行为模式


Single01-设计模式
https://blog.tjdata.site/posts/4de165f7.html
作者
chenxia
发布于
2022年4月8日
许可协议