架构师训练营第 1 期 -Week3 - 代码重构学习总结
这周根据几个框架(JUnit、spring等)讲了7个设计模式:简单工厂模式、单例模式、适配器模式、模板方法模式、策略模式、组合模式、装饰模式。设计模式有多达23个,有些设计模式的类图很相似,很容易混淆。学习设计模式关键在于知道每个设计模式所解决的那个问题,是那个问题的通用解决方案。以及每个设计模式的优缺点(设计模式实现了那个设计原则)。开闭原则是很重要很根本的原则。
上周讲了什么?
上周主要讲了5个设计原则:开闭原则、里氏替换原则、依赖倒置原则、单一职责原则、接口隔离原则,讲了代码的一些臭味:僵化性、脆弱性、牢固性、粘滞性、不必要的复杂性、不必要的重复性等。讲了软件编程语言的历史和软件开发的三要素:领域问题、人、机器。
5个设计原则都是围绕着高内聚低耦合来的。而实现高内聚低耦合的方法就是拆。如何拆,怎么拆,为什么要这么拆? 通过5个设计原则来看为什么拆,23个设计模式来拆分代码。与之相似的分布式系统架构,也是拆,拆系统,拆模块,拆功能。有了SOA,微服务,数据库横向集群,纵向集群等等,这背后体现的是分治法。所以串起来是:使用分治法来实现高内聚低耦合时,要通过使用原则进行指导,要通过设计模式进行实现。
依赖倒置原则,是框架设计的指导原则,是框架设计的核心技巧。它使架构师不纠结与程序设计的细节之中。架构师可以通过框架,框清代码,实现架构的落地。
本周讲了什么?
本周主要讲了7个设计模式:简单工厂模式、单例模式、适配器模式、模板方法模式、策略模式、组合模式、装饰器模式。以及spring中的依赖注入(DI)和控制反转(IOS)、MVC
设计模式
设计模式是可重复的解决方案,每一种设计模式都描述了一种问题的通用解决方案。所以学习设计模式的一个很要要的事情是知道这个模式是用来解决什么问题的。它是怎么解决这个问题的。它这么解决问题有哪些优势(一般是基于某些设计模式说的)
一个设计模式的四个部分: 模式的名词、待解问题、解决方案、结论(利弊等)
设计模式从功能上分类
创建模式:对类的实例化过程的抽象
结构模式:将类或对象结合在一起形成更大的结构
行为模式:对在不同的对象之间划分职责和算法的抽象化
创建模式(5个):
工厂模式
抽象工厂模式
单例模式
建造者模式
原型模式
结构模式(7个):
代理模式
桥接模式
适配器模式
外观模式
享元模式
装饰器模式
组合模式
行为模式(11个):
备忘录模式
策略模式
迭代模式
访问者模式
观察者模式
解释器模式
命令模式
责任了模式
中介者模式
状态模式
模板方法模式
这些设计模式从名字上看它们都是有一种思想,比如建造者、适配、装饰、观察者。都体现了一种思想。只要实现了这种思想,不管它是否完全符合设计模式的类图,那么它就体现了这个设计模式。所以设计模式不仅仅局限于类和对象。比如python的装饰模式。将设计模式背后的思想应用到开发工作中,才是真的活学活用。
简单工厂
简单工厂是非常重要的一种设计模式,是许多其他模式的基础。一个简单工厂可能仅仅就是一个方法或者函数。
简单工厂本身是不符合开闭原则,可以通过配置文件去解决。
单例模式
单例模式的分类:
懒汉式:在需要的时候在构建单例对象。存在线程安全问题
饿汉式:单例对象先构建好,推荐该种方法。
适配器模式
两种适配器
对象适配器: 通过组合被适配类的方式实现。推荐该种方法。
类适配器:通过继承被适配类的方式实现。
适配器的三个角色:适配器、被适配对象、适配器实现的接口
适配器与装饰器的区别:适配器是适配某一个接口,某一个使用场景,而装饰器是装饰某个接口。
模板方法模式
模板方法模式是扩展功能的最基本的形式之一。是类的行为模式。通过继承的方式来实现扩展。
模板在父类中定义好模板,子类只需要实现这个模板就可以了,至于模板如何被调用,模板调用的前后顺序,由父类去调用(这个方法可以理解成一种策略,所以模板方法模式可以和策略模式一起使用)。
模板方法模式的特征:在父类中定义模板方法(轮廓或者骨架的定义),该方法是抽象的。子类实现这些模板方法。
模板方法的几种实现形式:抽象方法、具体方法、钩子方法(子类中的方法)
策略模式
策略模式是扩展功能的另一种最基本的模式,是对象的行为模式,通过组合的方式来实现扩展。
策略模式的3个角色:策略接口,客户端类(上下文类),策略实现类。
策略模式实现了依赖倒置原则、开闭原则
组合模式
组合模式是一种对象的结构模式,组合模式适用在树结构的处理情况,也叫合成模式。
组合模式的3个角色:组合的接口,接口的实现,组合类
装饰器模式
装饰器模式是说在执行自己的方法之前把其他类的方法(跟我们实现同样一个接口)包装起来在执行。
是一种对象的结构模式。
装饰器的3个角色:接口、装饰类、被装饰类(这两个类实现同一个接口)
依赖注入(DI)和控制反转(IOC)
依赖注入是指不需要new依赖的类,而是通过参数方式注入进来。在Laravel框架中的Provider可以将被依赖的类注入到依赖的类中。实现依赖注入可以通过配置文件来配置。
MVC
mvc更像是一种框架设计的思路,实现mvc使用了多种设计模式,比如实现路由机制的时候,通过工厂模式实例化控制器对象;通过模板方法模式来设计控制器;通过策略模式来设计model层(支持不同的数据库,每种数据库可以理解为一种策略);
关于设计模式的思考
设计模式其实有很多种,只要它能够解决重复发生的问题的一些软件设计方法都可以被称为设计模式。
评论