(一)概念
1、设计模式又称软件设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。换句话说,就可以解决特定问题的一些套路,这些套路是前辈们经过实际的编程与设计而总结来的,有普遍性、可以在一定程度上反复使用。
2、设计模式的目的:
是为了提高代码的可重用性、代码的可读性和代码的可靠性。
3、学习设计模式的意义
设计模式本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解。
使用设计模式有什么好处:
1)提高思维能力、编程能力、设计能力
2)使得程序的设计更加标准化、代码编制更加的工程化
3)提高开发效率、缩短开发周期
4)提高代码的重用性、可读性、可靠性、灵活性、可维护性。
PS:但实际开发当中遇到的场景肯定是多样的,不能够固步自封,要根据实际的需求、生产环境,思考并设计合适的模式来进行项目的设计。
4、设计模式的要素
四个主要要素:
1)模式名称:概括模式处理的问题、特点、解决方法、功能、效果。
2)问题:描述模式处理的具体问题,何时使用相应的模式。
解释设计的问题和问题存在的前因后果以及所需要的前提条件。
3)解决方案:解决问题的模板(类似于定义API)。设计组成的成分,成分之间的组成关系以及各个成分的职能和协作方式。不是提供具体的实现方法,而是对问题进行描述以及处理问题所需要的要素组合(类或者对象的组合)来解决这个问题。
4)效果:罗列模式优缺点,主要对时间和空间进行衡量,模式对这个项目或者系统的灵活性、可扩展性、可移植性的影响、还有该模式实现的实际开发问题。
(二)设计模式的分类以及相应的功能
PS:设计模式有两种分类方法:1.根据模式的目的,2、根据模式的 作用。
范围|目的 | 创建型模式 | 构造型模式 | 行为型模式 |
---|---|---|---|
类模式 | 工厂方法 | (类)适配器 | 模板方法、解释器 |
对象模式 | 单例、原型、抽象工厂、建造者 | 代理、(对象)适配器、桥接、装饰、外观、享元、组合 | 策略、命令、职责链、状态、观察者、中介者、迭代者、访问者、备忘录 |
序号 | 模式 & 描述 | 包括 |
---|---|---|
1 | 创建型模式 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 | 工厂模式(Factory Pattern)抽象工厂模式(Abstract Factory Pattern)单例模式(Singleton Pattern)建造者模式(Builder Pattern)原型模式(Prototype Pattern) |
2 | 结构型模式 这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。 | 适配器模式(Adapter Pattern)桥接模式(Bridge Pattern)过滤器模式(Filter、Criteria Pattern)组合模式(Composite Pattern)装饰器模式(Decorator Pattern)外观模式(Facade Pattern)享元模式(Flyweight Pattern)代理模式(Proxy Pattern) |
3 | 行为型模式 这些设计模式特别关注对象之间的通信。 | 责任链模式(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) |
4 | J2EE 模式 这些设计模式特别关注表示层。这些模式是由 Sun Java Center 鉴定的。 | MVC 模式(MVC Pattern)业务代表模式(Business Delegate Pattern)组合实体模式(Composite Entity Pattern)数据访问对象模式(Data Access Object Pattern)前端控制器模式(Front Controller Pattern)拦截过滤器模式(Intercepting Filter Pattern)服务定位器模式(Service Locator Pattern)传输对象模式(Transfer Object Pattern) |
1、根据目的来划分:创建型模式、结构型模式、行为型模式。
1)创建型模式:用于描述"怎么样创建对象",主要特点,将对象的创建和使用分离。在设计模式中有:单例、原型、工厂方法、抽象工厂、建造者 。
2)结构型模式:描述如何将类或对象按照一定的组合方式或者布局方式组成一个更大更为复杂的结构,在设计模式中有:代理、适配器、桥接、装饰、外观、享元、组合。
3)行为型模式:用于描述类和对象之间怎么样相互协作共同完成单个对象无法单独完成的任务,以及分配职责。在设计模式中有:模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器。
2、根据作用范围划分:类模式、对象模式
1)类模式:用于处理类与子类之间的关系,关系由继承来建立,是静态的,在编译的时候就已经确定下来了。在设计模式中有:工厂方法、(类)适配器、模板方法、解释器。
2)对象模式:用于处理对象之间的关系,这些关系可以通过组合或者聚合来实现,在运行时刻是可以变化的,更具动态性。除了,工厂方法、(类)适配器、模板方法、解释器是类模式,其他的都为对象模式。
3、模式以及相应的功能:模式与模式之间不是
PS:模式与模式之间是联系的,并不是相互独立的。
序号 | 模式 | 功能 |
---|---|---|
1 | 单例模式(Singleton) | 某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。 |
2 | 原型模式(Prototype) | 将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。 |
3 | 工厂方法模式(Factory Method) | 定义一个用于创建产品的接口,由子类决定生产什么产品。 |
4 | 象工厂模式(AbstractFactory) | 提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。 |
5 | 建造者模式(Builder) | 将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。 |
6 | 代理模式(Proxy) | 为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。 |
7 | 配器模式(Adapter) | 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。 |
8 | 桥接模式(Bridge) | 将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。 |
9 | 装饰模式(Decorator) | 动态的给对象增加一些职责,即增加其额外的功能。 |
10 | 外观模式(Facade) | 为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。 |
11 | 享元模式(Flyweight) | 运用共享技术来有效地支持大量细粒度对象的复用。 |
12 | 组合模式(Composite) | 将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。 |
13 | 模板方法模式(TemplateMethod) | 定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。 |
14 | 策略模式(Strategy) | 定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。 |
15 | 命令模式(Command) | 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。 |
16 | 职责链模式(Chain of Responsibility) | 把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。 |
17 | 状态模式(State) | 允许一个对象在其内部状态发生改变时改变其行为能力。 |
18 | 观察者模式(Observer) | 多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。 |
19 | 中介者模式(Mediator) | 定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。 |
20 | 迭代器模式(Iterator) | 提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。 |
21 | 访问者模式(Visitor) | 在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。 |
22 | 备忘录模式(Memento) | 在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它。 |
23 | 解释器模式(Interpreter) | 提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。 |
设计模式之间的关系:
设计模式之间的关系
最后,感谢各位的关注,希望我的分享能够给大家的学习生活带来一些帮助。
转载文章请记得标明:
作者:OS0day
微信公众号:软件开发与安全
(文章部分素材来源于互联网,如果涉嫌侵权,可以联系公众号管理员进行处理。)