设计模式概述篇

一、软件设计模式的概念与意义

1. 软件设计模式的概念
软件设计模式(Software Design Pattern),又称设计模式(Design Pattern),是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。其目的是为了提高代码的可重用性、代码的可读性和代码的可靠性。

2. 学习设计模式的意义
设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解。正确使用设计模式具有以下优点。

  • 可以提高程序员的思维能力、编程能力和设计能力。
  • 使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。
  • 使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。

因此设计模式并不是Java语言的专利,它同样适用于 C++、C#、JavaScript 等其它面向对象的编程语言。

当然,软件设计模式只是一个引导。在具体的软件幵发中,必须根据设计的应用系统的特点和要求来恰当选择。对于简单的程序开发,可能写一个简单的算法要比引入某种设计模式更加容易。但对大项目的开发或者框架设计,用设计模式来组织代码显然更好。

二、软件设计模式的基本要素

软件设计模式使人们可以更加简单方便地复用成功的设计和体系结构,它通常包含以下几个基本要素:模式名称、别名、动机、问题、解决方案、效果、结构、模式角色、合作关系、实现方法、适用性、已知应用、例程、模式扩展和相关模式等,其中最关键的元素包括以下 4 个主要部分。

1. 模式名称
每一个模式都有自己的名字,通常用一两个词来描述,可以根据模式的问题、特点、解决方案、功能和效果来命名。模式名称(PatternName)有助于我们理解和记忆该模式,也方便我们来讨论自己的设计。

2. 问题
问题(Problem)描述了该模式的应用环境,即何时使用该模式。它解释了设计问题和问题存在的前因后果,以及必须满足的一系列先决条件。

3. 解决方案
模式问题的解决方案(Solution)包括设计的组成成分、它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象的 组合)来解决这个问题。

4. 效果
描述了模式的应用效果以及使用该模式应该权衡的问题,即模式的优缺点。主要是对时间和空间的衡量,以及该模式对系统的灵活性、扩充性、可移植性的影响,也考虑其实现问题。显式地列出这些效果(Consequence)对理解和评价这些模式有很大的帮助。

三、常见设计模式分类

设计模式有两种分类方法,即根据模式的目的来分和根据模式的作用的范围来分。

1. 根据目的来分
根据模式是用来完成什么工作来划分,这种方式可分为创建型模式、结构型模式和行为型模式 3 种。

  • 创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。如单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式等 5 种创建型模式。

  • 结构性模式:用于描述如何将类或对象按某种布局组成更大的结构。如代理模式、适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式等 7 种结构型模式

  • 行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。如模板方法模式、策略模式、命令模式、职责链模式、状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式等 11 种行为型模式。

2. 根据作用范围来分
根据模式是主要用于类上还是主要用于对象上来分,这种方式可分为类模式和对象模式两种。

  • 类模式:用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻便确定下来了。如工厂方法模式、(类)适配器模式、模板方法模式、解释器模式属于该模式。

  • 对象模式:用于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运行时刻是可以变化的,更具动态性。常见23种设计模式中除了以上 4 种,其他的都是对象模式。

四、面向对象设计模式七大原则

原则名称 简单定义
开闭原则(Open Closed Principle,OCP) 对扩展开放,对修改关闭。即软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的。
单一职责原则(Single Responsibility Principle, SRP) 对功能进行分类,代码进行解耦,一个类只负责一个功能领域中的相应职责。
里氏替换原则(Liskov Substitution Principle,LSP) 确保超类所拥有的性质在子类中仍然成立。即子类可以扩展父类的功能,但尽量不要改变父类原有的功能
依赖倒置原则(Dependence Inversion Principle,DIP) 依赖于抽象,不能依赖于具体实现(面向接口编程)
接口隔离原则(Interface Segregation Principle,ISP) 尽量将臃肿庞大的接口拆分成更小的和更具体的接口,一个类对另一个类的依赖应该建立在最小的接口。即要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。
迪米特法则(Law of Demeter,LoD)又称最少知识原则(Least Knowledge Principle,LKP) 只与你的直接朋友交谈,不跟“陌生人”说话。即如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
合成复用原则(Composite Reuse Principle,CRP)又称组合/聚合复用原则(Composition/Aggregate Reuse Principle,CARP) 要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现

五、参考

C语言中文网-设计模式

你可能感兴趣的:(设计模式,设计模式,设计模式基本要素,设计模式分类,设计模式基本原则)