Skip to content

记录 #1

@mind1949

Description

@mind1949

如何看待设计模式

模式与问题的关系

  • 是根据问题思考解决方案(设计模式),而不是用解决方案(设计模式)去思考问题;
  • 设计模式只是解决某类问题的参考答案;
  • 自己尝试解决某个模式想要解决的问题,然后参考设计模式,形成自己的结题思路;

解释

设计模式不是万能药,只能在必要的时候使用才能恰当的解决问题,否则会使问题复杂化。
不同语言提供的特性不同,在设计模式上也各有不同。例如go里函数式第一公民,Builder模式可以转换成functional options模式。
所以设计模式不能用来死记硬套的,要把它当做一种解决某类问题的参考答案。问自己某个设计模式是解决什么问题的?如何是自己面对这个问题会怎么解决?最终会自然而然的得到产生某个设计模式的思考过程。这样当工作中面对一个问题时,就不会硬套设计模式了,而是会自己思考,最终得出一个解决方案,只是这个方案有可能是某条设计模式罢了。

面向对象技术

对象和类之间的关系

图片

三大支柱

  • 继承或组合(组合优于继承)
  • 封装
  • 多态

23种设计模式

工厂方法

结构

图片

抽象工厂

结构

图片

生成器

思考

  • 链式函数调用;
  • 每个函数对应一个步骤;

结构

图片

原型

问题

如何在不知道一个对象内部结构的情况下复制这个对象?

思考

只有这个对象知道自己的内部结构,那只能让这个对象来复制这个对象。这有点像go中context包获取注入信息的最佳实践。

结构

基本

图片

注册表

图片

单例

结构

图片

适配器

问题

我们想使用功能,但提供这个功能的组件有很多,并且每个组件提供的接口不一样

思考

在自己的业务逻辑里,生命一个满足功能需求的接口,然后写适配组件封装提供功能的接口。

结构

图片

桥接

问题

结构

图片

组合

结构

图片

装饰

使用函数式编程实现装饰模式

结构

图片

外观

结构

图片

享元

结构

图片

代理

结构

图片

责任链

使用函数式编程完成责任链

分析

  • 将各个处理者间承转的工作放到处理者内部,这样就可以很容易的增删改责任链中的处理者;

结构

图片

命令

备注

没有时间感受到命令模式的价值

结构

图片

迭代器

go里面使用Next()模式实现迭代

例如rows.Next()、scanner.Scan();
参考资料: 3-ways-to-iterate-in-go

结构

图片

中介者

结构

图片

备忘录

结构

图片

观察者

结构

图片

状态

结构

图片

策略

结构

图片

模板方法

结构

图片

访问者

结构

图片

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions