设计模式总结
一、七大原则
在实际开发过程中,并不是一定要求所有代码都遵循设计原则,而是要综合考虑人力、时间、成本、质量,不刻意追求完美,要在适当的场景遵循设计原则。这体现的是一种平衡取舍,可以帮助我们设计出更加优雅的代码结构。各种原则要求的侧重点不同,下面我们分别用一句话归纳总结软件设计模式的七大原则,如下表所示。
实际上,这些原则的目的只有一个:降低对象之间的耦合,增加程序的可复用性、可扩展性和可维护性。在程序设计时,我们应该将程序功能最小化,每个类只干一件事。若有类似功能基础之上添加新功能,则要合理使用继承。对于多方法的调用,要会运用接口,同时合理设置接口功能与数量。最后类与类之间做到低耦合高内聚。
二、设计模式分类
1.创建型模式
创建型模式,就是创建对象的模式,抽象了实例化的过程。它帮助一个系统独立于如何创建、组合和表示它的那些对象。关注的是对象的创建,创建型模式将创建对象的过程进行了抽象,也可以理解为将创建对象的过程进行了封装,作为客户程序仅仅需要去使用对象,而不再关系创建对象过程中的逻辑。
社会化的分工越来越细,自然在软件设计方面也是如此,因此对象的创建和对象的使用分开也就成为了必然趋势。因为对象的创建会消耗掉系统的很多资源,所以单独对对象的创建进行研究,从而能够高效地创建对象就是创建型模式要探讨的问题。这里有6个具体的创建型模式可供研究,它们分别是:
- 简单工厂模式(Simple Factory)
- 工厂方法模式(Factory Method)
- 抽象工厂模式(Abstract Factory)
- 创建者模式(Builder)
- 原型模式(Prototype)
- 单例模式(Singleton)
2.结构型模式
结构型模式是为解决怎样组装现有的类,设计它们的交互方式,从而达到实现一定的功能目的。结构型模式包容了对很多问题的解决。例如:扩展性(外观、组成、代理、装饰)、封装(适配器、桥接)。
在解决了对象的创建问题之后,对象的组成以及对象之间的依赖关系就成了开发人员关注的焦点,因为如何设计对象的结构、继承和依赖关系会影响到后续程序的维护性、代码的健壮性、耦合性等。对象结构的设计很容易体现出设计人员水平的高低,这里有7个具体的结构型模式可供研究,它们分别是:
- 外观模式/门面模式(Facade门面模式)
- 适配器模式(Adapter)
- 代理模式(Proxy)
- 装饰模式(Decorator)
- 桥梁模式/桥接模式(Bridge)
- 组合模式(Composite)
- 享元模式(Flyweight)
3.行为型模式
行为型模式涉及到算法和对象间职责的分配,行为模式描述了对象和类的模式,以及它们之间的通信模式,行为模式刻划了在程序运行时难以跟踪的复杂的控制流可分为行为类模式和行为对象模式。1. 行为类模式使用继承机制在类间分派行为。2. 行为对象模式使用对象聚合来分配行为。一些行为对象模式描述了一组对等的对象怎样相互协作以完成其中任何一个对象都无法单独完成的任务。
在对象的结构和对象的创建问题都解决了之后,就剩下对象的行为问题了,如果对象的行为设计的好,那么对象的行为就会更清晰,它们之间的协作效率就会提高,这里有11个具体的行为型模式可供研究,它们分别是:
- 模板方法模式(Template Method)
- 观察者模式(Observer)
- 状态模式(State)
- 策略模式(Strategy)
- 职责链模式(Chain of Responsibility)
- 命令模式(Command)
- 访问者模式(Visitor)
- 调停者模式(Mediator)
- 备忘录模式(Memento)
- 迭代器模式(Iterator)
- 解释器模式(Interpreter)
三、三者之间的区别和联系
创建型模式提供生存环境,结构型模式提供生存理由,行为型模式提供如何生存。
- 创建型模式为其他两种模式使用提供了环境。
- 结构型模式侧重于接口的使用,它做的一切工作都是对象或是类之间的交互,提供一个门。
- 行为型模式顾名思义,侧重于具体行为,所以概念中才会出现职责分配和算法通信等内容。
四、一句话归纳设计模式
五、设计模式对比
1.策略模式 VS 委派模式
- 共同点:行为型模式
- 不同点:策略模式关注能否相互替换,委派模式关注分发和调度的过程
- 关联:切换的上下文
2.工厂方法模式 VS 抽象工厂模式
- 共同点:1、创建型模式;2、职责相同
- 不同点:创建出来的产品扩展程度不一样,工厂方法单维度扩展,抽象工厂可以实现多维度扩展
- 关联:工厂方法很多情况下会作为抽象工厂的子类
3.策略模式vs代理模式
- 不同:策略行为型、代理是结构型
4.中介模式VS桥接模式
- 共同点:具备两个对象建立联系
- 不同点:1、行为型VS结构型;2、中介者将多维度网状结构的对象建立联系;桥接模式将两个维度(抽象和具象)建立联系
- 关联:中介者是更复杂的桥
5.代理模式VS委派模式
- 共同点:都有保护目标对象的特性
- 不同点:1、结构型VS行为型;2、职责不同,委派模式不对目标的功能做增强,代理是一定要干活的
- 关联:委派就是全权静态代理,没有增强的代理就是委派
6.代理模式vs中介者模式
- 共同点:都有保护目标对象的特性
- 不同点:1、结构型VS行为型;2、干预程度不同,代理是“媒婆”,中介者是“不负责任的媒婆”;3、代理参与其中的过程,中介者只做牵线搭桥,不参与过程
- 关联:中介者是一种面向更加复杂的对象关系的全权静态代理(委派)
7.桥接模式 VS 适配器模式
- 共同点:1、都是结构型 ;2、都存在对象的间接引用关系;
- 不同点:1、使用场景不同,适配器希望已有代码稳定的,桥接希望已有代码是扩展的;2、原则不同:桥接不推荐使用继承的,适配器会采用继承
8.建造者VS工厂模式
- 共同点:1、都属于创建型;2、职责相同,都是将创建产品的细节封装起来;
- 不同点:1、目的不同:工厂模式希望创建标品(标准产品)、建造者希望创建个性化产品(定制化);2、产品复杂程度不一样:工厂模式产品相对单一,建造者产品粒度更细
- 关联:工厂一般会设置为单例,而建造者一般是多例
9.代理模式VS适配器模式
- 共同点:1、结构型模式;2、包装器模式的实现;3、都起到了隐藏和保护目标对象的作用
- 不同点:目的不同,代理为了功能增强、适配器为了解决兼容问题
- 关联:对象适配器其实就是静态代理的一种实现
10.适配器VS装饰器
- 共同点:1、都属于结构型模式;2、包装器模式的一种
- 不同点:1、装饰器同宗同源,适配器纯属伪装;2、目的不同:适配器是为兼容(转换)、装饰器是为增强(不改变原有功能);
- 关联:结构上有点类似
11.桥接模式VS组合模式
- 共同点:都属于行为型模式
- 不同点:桥接模式的目的是将两个继承体系建立联系,组合模式的目的不是为了建立连接,而是统一的API
- 关联:关联性不大
12.策略模式VS模板方法模式
- 共同点:1、都属于行为型模式;2、可以将底层和应用代码的某些细节分离
- 不同点:1、开放程度不一样:策略模式只允许用户选,模板模式允许微调
- 关联:混合使用