设计模式介绍以及学习方法

一、前言

1 设计模式

        设计模式是指在软件开发中,经过验证的,用于解决在特定环境下,重复出现的,特定问题的解决方案,简白的说就是——"解决问题的固定套路"总共有 23 种设计模式。这些模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns),本文主要抽选几个常用的介绍。设计模式的详细介绍可看下边链接:设计模式简介 | 菜鸟教程 (runoob.com)https://www.runoob.com/design-pattern/design-pattern-intro.html2 设计模式解决了什么问题?

  • 前提:具体需求既有稳定点,又有变化点;
  • 期望修改少量的代码,就可以适应需求的变化;
  • 比喻:整洁的房间,好动的猫,怎么保持房间的整洁?把猫关在一个笼子里。
3 设计模式基础
3.1面对对象的思想
  • 封装:隐藏实现细节,实现模块化
  • 继承:无需修改原有类的情况下通过继承实现对功能的扩展
  • 多态:静态多态---函数重载,动态多态---继承中虚函数重写
3.2 设计原则

 3.3 设计模式学习

明确目的:

  • 在现有的设计模式基础上扩展代码,做功能抽象时,根据不同的功能选择设计模式。

学习步骤:

  • 该设计模式解决了什么问题?解剖稳定点是什么?解剖变化点是什么?
  • 该设计模式的代码结构是什么?
  • 符合那些设计原则?
  • 如何在上面扩展代码?
  • 该设计模式有那些典型应用场景?(联想工作场景,有哪些开源框架)

3.4 模板方法(设计模式基础)

定义: 定义一个操作中的算法的骨架 ,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 ——《设计模式》 GoF
要点:
  • 最常用的设计模式,子类可以复写父类子流程,使父类的骨架流程丰富;
  • 反向控制流程的典型应用;
  • 父类 protected 保护子类需要复写的子流程;这样子类的子流程只能父类来调用;

本质:通过固定算法骨架来约束子类的行为;

二 行为型模式

        这些设计模式特别关注对象之间的通信。

  • 责任链模式(Chain of Responsibility Pattern)
  • 命令模式(Command Pattern)
  • 解释器模式(Interpreter Pattern)
  • 迭代器模式(Iterator Pattern)
  • 中介者模式(Mediator Pattern)
  • 备忘录模式(Memento Pattern)
  • 观察者模式(Observer Pattern)
  • 状态模式(State Pattern)
  • 空对象模式(Null Object Pattern)
  • 策略模式(Strategy Pattern)
  • 模板模式(Template Pattern)
  • 访问者模式(Visitor Pattern)

1 观察者模式

定义:定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。 ——《设计模式》 GoF

背景: 气象站发布气象资料给数据中心,数据中心经过处理,将气象 信息更新到两个不同的显示终端(A 和 B )。
要点
  • 观察者模式使得我们可以独立地改变目标与观察者,从而使二者之间的关系松耦合;
  • 观察者自己决定是否订阅通知,目标对象并不关注谁订阅了;
  • 观察者不要依赖通知顺序,目标对象也不知道通知顺序;
  • 常用在基于事件的ui框架中,也是 MVC 的组成部分;
  • 常用在分布式系统中、actor框架中;
本质:触发联动  

策略模式

定义 : 定义一系列算法 ,把它们一个个封装起来,并且使它们可互相替换。该模式使得算法可独立于使用它的客户程序而变化。——《设计模式》 GoF
背景 : 某商场节假日有固定促销活动,为了加大促销力度,现提升国庆节促销活动规格;
要点:策略模式提供了一系列可重用的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换;策略模式消除了条件判断语句;也就是在解耦合;
本质 :分离算法,选择实现;

3、 责任链模式

定义: 使多个对象都有机会处理请求,从而避免请求的发送者和接收 者之间的耦合关系。将这些对象连成一条链,并沿着这条链传 递请求,直到有一个对象处理它为止。 —— 《设计模式》 GoF
背景: 请求流程, 1 天内需要主程序批准, 3 天内需要项目经理批准, 3 天以上需要老板批准;
要点
  • 解耦请求方和处理方,请求方不知道请求是如何被处理,处理方的组成是由相互独立的子处理构成,子处理流程通过链表的方式连接,子处理请求可以按任意顺序组合;
  • 责任链请求强调请求最终由一个子处理流程处理;通过了各个子处理条件判断;
  • 责任链扩展就是功能链,功能链强调的是,一个请求依次经由功能链中的子处理流程处理;
  • 将职责以及职责顺序运行进行抽象,那么职责变化可以任意扩展,同时职责顺序也可以任意扩展;

本质:分离职责,动态组合;

三、创建型模式

        这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。
  • 工厂模式(Factory Pattern)
  • 抽象工厂模式(Abstract Factory Pattern)
  • 单例模式(Singleton Pattern)
  • 建造者模式(Builder Pattern)
  • 原型模式(Prototype Pattern)

1、单例模式

定义: 保证一个类仅有一个实例,并提供一个该实例的全局访问点。 —— 《设计模式》 GoF
  • 单例类只能有一个实例。
  • 单例类必须自己创建自己的唯一实例。
  • 单例类必须给所有其他对象提供这一实例。

缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

 2、工厂模式

定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method 使得一个类的实例化延迟到子类。 —— 《设计 模式》 GoF
背景: 实现一个导出数据的接口,让客户选择数据的导出方式;
要点 解决创建过程比较复杂,希望对外隐藏这些细节的场景;
  • 比如连接池、线程池
  • 隐藏对象真实类型;
  • 对象创建会有很多参数来决定如何创建;
  • 创建对象有复杂的依赖关系;

本质 延迟到子类来选择实现;

 

 3、抽象工厂模式 

定义 提供一个接口,让该接口负责创建一系列 相关或者相互依赖的 对象 ,无需指定它们具体的类。 —— 《设计模式》 GoF

意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

主要解决:主要解决接口选择的问题。

何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

如何解决:在一个产品族里面,定义多个产品。

关键代码:在一个工厂里聚合多个同类产品。

优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。

四、结构性模型

        这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。
  • 适配器模式(Adapter Pattern)
  • 桥接模式(Bridge Pattern)
  • 过滤器模式(Filter、Criteria Pattern)
  • 组合模式(Composite Pattern)
  • 装饰器模式(Decorator Pattern)
  • 外观模式(Facade Pattern)
  • 享元模式(Flyweight Pattern)
  • 代理模式(Proxy Pattern)

1、装饰器模式 

定义: 动态地给一个对象增加一些额外的职责。就增加功能而言,装 饰器模式比生产子类更为灵活。 —— 《设计模式》 GoF

用例:普通员工有销售奖金,累计奖金,部门经理除此之外还有团队奖金;后面可能会添加环比增长奖金,同时可能针对不同的职位产生不同的奖金组合;

要点:
  • 通过采用组合而非继承的手法, 装饰器模式实现了在运行时动态扩展对象功能的能力,而且可以根据需要扩展多个功能。 避免了使用继承带来的“灵活性差多子类衍生问题
  • 不是解决 多子类衍生问题 问题,而是解决 父类在多个方向上的扩展功能” 问题;
  • 装饰器模式把一系列复杂的功能分散到每个装饰器当中,一般一个装饰器只实现一个功能,实现复用装饰器的功能;
什么时候使用?
        不影响其他对象的情况下,以动态、透明的方式给对象添加职责;每个职责都是完全独立的功能,彼此之间没有依赖;
本质:动态组合

2、组合模式

定义: 将对象组合成树型结构以表示 部分 - 整体 的层次结构。组合模 式使得用户对单个对象和组合对象的使用具有一致性。
什么时候使用组合模式?
  • 如果你想表示对象的部分-整体层次结构,可以选用组合模式,把整体和部分的操作统一起来,使得层次结构实现更简单,从外部来使用这个层次结构也容易;
  • 如果你希望统一地使用组合结构中的所有对象,可以选用组合模式,这正是组合模式提供的主要功能;

怎么实现?

将叶子节点当成特殊的组合对象看待,从而统一叶子对象和组合对象;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值