写点什么

架构师训练营第三周学习总结

用户头像
Geek_xq
关注
发布于: 2020 年 12 月 08 日

这一周主要学习了几个设计模式:

  1. 设计模式定义

  • 每一种模式都描述了一种问题的通用解决方案

  • 设计模式是一种可重复使用的解决方案

  1. 从以下四方面去了解一个设计模式,:

  • 名称

  • 待解决的问题-描述了何时需要运用这种模式,以及运用模式的环境(上下文)。

  • 解决方案-描述了组成设计的元素(类和对象)、它们之间的关系、职责以及合作。

  • 利弊分析-运用这种方案所带来的利和弊。主要是指它对系统的弹性、扩展性、和可移植性的影响

  1. 设计模式的分类:

  • 从功能分

  • 创建模式(Creational Patterns)

  • 对类的实例化过程的抽象。

  • 结构模式(Structural Patterns)

  • 将类或者对象结合在一起形成更大的结构。

  • 行为模式(Behavioral Patterns)

  • 对在不同的对象之间划分责任和算法的抽象化

  • 从方式分

  1. 简单工厂的优缺点

  • 工作原理:专门定义一个类来负责创建其他类的实例,根据参数的不同返回不同类的实例

  • 优点: 使Client不再依赖Sorter的具体实现(如BubbleSorter), 对Client实现OCP -增加Sorter不影响Client

  • 缺点: 对Factory未实现OCP -增加Sorter需要修改Factory

  • 对简单工厂的改进: 把需要变化的部分变成配置,缺点:没法传参

  1. Singleton模式保证产生单一实例,就是说一个类只产生一个实例

  • 特点:

  • 可以减少实例频繁创建和销毁带来的资源消耗;

  • 是当多个用户使用这个实例的时候,便于进行统一控制(比如打印机对象)。

  • 实现方法:

  • 方法一(饿汉模式:instance 提前创建):构造函数是private的,一个private static的成员变量instance,它是用private 构造函数构造出来的,应用调用static public的成员方法getInstance ()来获得实例

  • 方法二(懒汉模式):不事先构造private static的成员变量instance,它是在getinstance时判断是否以构建,没有,则构造一个,为避免多线程调用导致创建多个实例,getInstance()前面加synchronized 同步锁

  • 推荐方法一

  • 单例中的成员变量是多线程重用的,可能会产生意想不到的结果,因此尽量将单例设计为无 状态对象(只提供服务,不保存状态)

  1. 适配器方法:

  • 运用场景:加一个适配器类去实现接口中的方法,实现的时候,由适配器类去调用某个已经实现这一方法但未暴露这一方法的类(被适配器类)来实现接口中定义的方法

  1. 模板方法模式:

  • 模板方法模式是扩展功能的最基本模式之一 , 它是一种“类的行为模式”

  • 它是通过“继承”的方法来实现扩展 , 基类负责算法的轮廓和骨架 •,子类负责算法的具体实现

  • 几种实现形式

  • 抽象方法

  • protected abstract void step1(); •

  • 强制子类实现该步骤。

  • 具体方法

  • protected void doSomething() { … }

  • 子类不需要覆盖,但也可以覆盖之。

  • 如想明确告诉子类“不要覆盖它”,好标明:final

  • 钩子方法

  • protected void setUp() { }

  • 空的实现(缺省适配器模式)

  • 子类可选择性地覆盖之,以便在特定的时机做些事。

  1. 策略模式: 应用程序根据接口进行编程,由具体的实现类去实现接口,开发期针对接口进行开发,在运行过程中调用某种策略实现类进行运行

  • 解决的问题: 系统需要在多种算法中选择一种

  • 把if else包装成策略实现

  1. 组合模式:例子: junit中的testsuite

  • 应用场景:树结构,重复操作

  1. 装饰器模式:

  • 应用场景:

  • 在不影响其他对象的情况下,需要以动态、透明的方式给随时给被装饰对象添加或者移除某些功能时而不影响原有逻辑,想通过灵活组合对象的方式动态地改变被装饰对象的行为

  • 需要扩展一个类的功能或给一个类增加或随时移除附加功能。

  • 当需要以多层次的继承关系才能实现扩充时,可以考虑装饰器模式。

  • 需要为某一类型的兄弟类进行改装或加装功能,首选装饰模式。

  • 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。

  • 装饰对象包含一个真实对象的引用(reference)

  • 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。

  • 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。

  • 装饰器和模板方法、策略模式的比较

  • 装饰器保持对象的功能不变,扩展其外围的功能

  • 模板方法和策略模式则保持算法的框架不变,而扩展其内部的实现

  • 装饰器和继承的比较

  • 都可以用来扩展对象的功能

  • 但装饰器是动态的,继承是静态的

  • 装饰器可以任意组合,但这也使装饰器更复杂,有可能会组合出荒谬的结果

  1. 例子: intel 大数据sql引擎

  • transformer: 装饰器模式,模板方法(子类实现基类定义的抽象方法,真正的业务流程是在基类里实现的)

  • generator: 模板方法(子类实现基类定义的抽象方法,真正的业务流程是在基类里实现的)



用户头像

Geek_xq

关注

还未添加个人签名 2020.10.15 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第三周学习总结