设计模式小总结

参考来源
这个是学习笔记,为了迅速回忆我尽量精简自己的理解写在下面,具体内容应该看这个帖子,写的非常好:

  • 创建型
    • 简单工厂:抽象了类型创建接口
    • 工厂方法:不仅抽象了类型创建接口,还抽象了类型创建的方法接口:
      我理解简单工厂使用了统一的对象创建函数,封装了不同的对象以基类指针的形式返回出去,但是它使用了同一份创建对象的代码。
      而工厂方法则是通过派生的方式,提供这个创建函数的不同版本。
    • 抽象工厂: 通过派生的方法将一个系列的类型以及类型构造方法组合在了一个工厂里面
    • 生成器: 如果构造过程复杂,参数较多,为了实现构造过程的可配置以及解决构造器伸缩问题(构造器参数太多),把过程拆解为分离的步骤,也可以认为把参数拆解为函数来进行配置
    • 原型: 直接拷贝对象实例这个容易理解
    • 单例:注意什么是饿汉什么是懒汉模式
  • 结构型
    • 适配器:中间加一层包装,改变接口外观使之适配
    • 桥接器:与适配器不同,适配器是在一个类型上包一层使之能够组合到另一个已经存在的类中间去;桥接器是在接口层面对一个类进行拆分和剥离,逻辑上将一部分可扩展的内容剥离到另一个层次中间去。就像在浏览器的实现中剥离出浏览器主题的实现一样
    • 组合: 其实就是利用堕胎统一封装统一处理,比如窗口绘制的过程中,按钮是一种组件,label也是一种组件,label可以放到按钮里面去和按钮一起组成新的组件,这个组件又可以和其他一起组成新的组件等等
    • 装饰者:依旧是封装,但特点是依赖一个统一的接口。通常有一个抽象接口,然后装饰器和子类都继承同样的接口,装饰器动态持有这些子类。一方面可以通过子类的不同实现不同的功能,另一方面也可以加入代码定制子类功能之外的操作。而用户除了抽象接口之外,对其他的是不感知的
    • 外观: 把复杂的难看的操作统统封装在一个简单的接口中
    • 享元: 复用的思想,如果一种对象存在了,就不要再新造一个了,直接拿来用
    • 代理:“使用代理模式,一个类会表现出另一个类的功能”。也是加一层,但不只是改变接口,更多的是添加功能。而适配器只是为了单纯的兼容接口。可以认为如果一个类已经具备接入接口的要求,那这个时候就完全没有适配器什么事儿了,但是代理模式依旧会在上面包一层来添加一些功能
  • 行为型设计模式(注重类型间如何协同)
    • 责任链:在一个处理器的链条上依次对任务进行处理,如果当前节点能处理就处理,不能处理就交给后面的节点。当前节点定义适配的情形以及在不适配时调用下一节点的处理函数。
    • command模式:将对接收者的操作封装在command类中,不同的command子类实现不同的操作,调用者通过command来操作对象。特别是在exec/undo这种情形下适用
    • 迭代器:访问元素而不暴露底层接口
    • 中介者:有点像星状结构,中间有一个消息传递或者说协议翻译对象,大家使用这个中间者来进行互相交流
    • 备忘录:用于保存对象历史状态使得方便回退操作。原生对象有两个接口,一个是提供状态,一个是根据状态还原自己。备忘录保存这些状态,执行者持有备忘录
    • 观察者(订阅-发布):实际上是订阅者和发布者互相持有对方指针,发布者在自身状态改变后依次通知向其注册过的订阅者告知他们我状态改变了,订阅者根据自身情况调用发布者接口获取状态。通常在订阅发布者之间会维护一个订阅表来维护多个订阅发布者之间的关系。
    • 访问者:将数据及其操作分离,通过注入的方式使得操作能够获得不同的数据。数据的持有者留有一个accept接口调用visit,并向visit接口注入数据。visit函数是可定制的。
    • 策略模式:
    • 状态模式:这两个非常像,都是注入+多态,解释下:实际操作派生自一个接口,各派生类实现不同操作。调用时将这个派生类作为参数传递到某个function或者类X中,X负责调用抽象操作接口完成具体功能。状态和策略的不同之处:策略可能是影响了一个操作,而状态则是对整个类有影响的,可能会引起一系列的变动。状态语义上是可存储的,你可以把状态get出来看一下。
    • 模版:实际上是基类通过只使用虚函数的方式,将一个工作的过程全部定义好,但是并不定义每个步骤具体到底怎么做。而各个子类根据需要实现具体步骤的执行方式。
posted @ 2020-01-10 12:51  楠渡  阅读(97)  评论(0编辑  收藏  举报