Skip to content

设计模式

七大原则

这些原则主要的目的是提高代码的可维护性可复用性可扩展性

单一职责原则 (SRP):

  • 概念: 一个类或模块应该有且仅有一个改变的理由。换句话说,一个类应负责一项明确的功能或职责

  • 应用: 通过拆分复杂的类为多个小类,每个类专注于单一职责,这样修改一处功能时,不会影响到其他职责。

开放封闭原则 (OCP ):

  • 概念: 软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。这意味着可以在不修改原有代码的情况下进行功能扩展。

  • 应用: 通过抽象和接口设计,使得新增功能可以通过增加新的类来实现,而不是修改现有类。

里氏替换原则 (LSP):

  • 概念: 子类应当能够替换它们的基类并在软件中正确工作,而不会引起错误或异常行为。

  • 应用: 确保子类不会改变父类的预期行为,保证多态性的安全使用。

依赖倒转原则 (DIP):

  • 概念: 高层模块不应依赖于低层模块,二者都应依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。

  • 应用: 通过面向接口编程,而不是具体类,使得系统更加灵活,易于测试和维护。

接口隔离原则 (ISP):

  • 概念: 客户端不应该被迫依赖它不使用的方法。接口应该尽可能细化,以满足不同客户端的具体需求。

  • 应用: 将大接口拆分为多个小接口,每个接口服务于一个特定的客户类群。

迪米特法则 (LoD )最少知识原则:

  • 概念: 一个对象应当对其他对象有最少的了解。也就是说,尽量减少对象之间的交互,仅通过接口通信

  • 应用: 减少类之间的耦合,每个类只和它的朋友(直接的朋友或通过参数传递的对象)交流,不和朋友的朋友交谈。

合成/聚合复用原则 (CARP ):

  • 概念: 尽量使用对象组合,而不是类继承来达到复用的目的。即“要尽量使用对象组合,而不是类继承”。

  • 应用: 优先考虑对象的组合(聚合或合成),这样可以更灵活地在运行时改变对象的行为,同时避免继承的复杂性。

UML类图

TIP

此文档图数据来源于《大话数设计模式》

UML

基本构成元素

  1. 类(Class): 通常表示为一个矩形,分为三部分:
    • 类名:位于顶部。
    • 属性(Attributes):位于中部,可标注访问修饰符(如public, private, protected等)。
    • 操作(Operations/Methods):位于底部,同样可标注访问修饰符。
  2. 接口(Interface): 与类类似,但顶部有<>标记以区分,强调它只包含操作定义,不包含属性。
  3. 包(Package): 用于组织和分组类和接口,通常用一个文件夹图标表示。

类和接口

java
//类
abstract class Animal{}
interface IFly{
    void fly();
}

关系

  • 依赖关系(Dependency): 用虚线箭头表示,表明一个类依赖于另一个类的定义,通常是由于方法参数或局部变量的使用。

  • 关联关系(Association): 用实线箭头表示类之间的结构关系。可以是单向或多向,可带有角色名和多重性标记(如1..*表示一对多关系)。

依赖和关联

java
//关联关系
class Penguin extends Bird{
    //在企鹅Penguin中,引用了气候Climate对象
    private Climate climate;
}
//依赖关系
abstract class Animal {
    public Metabolism(Oxygen oxygen,Water water){}
}
  • 聚合关系(Aggregation): 一种特殊的关联,表示整体与部分的关系,用空心菱形的实线箭头表示,强调部分可以独立存在。

  • 组合关系(Composition): 也是整体与部分的关系,但部分不能独立于整体存在,用实心菱形的实线箭头表示。

聚合和组合

java
//聚合关系
class WideGooseAggregate{
    //在雁群WideGooseAggregate中有大雁数组对象arrayWideGoose
    private WideGoose[] arrayWideGoose;
}
//组合关系
class Bird{
    //在Bird类中声明一个翅膀Wing和对象wing
    private Wing wing;
    //初始化时候,实例化翅膀,他们之间同时生成
    public Bird(){
        wing = new Wing();
    }
}
  • 继承/泛化关系(Inheritance/Generalization): 用带空心三角形的实线箭头表示,表示一个类继承另一个类的特性和行为。

  • 实现关系(Realization): 用带空心三角形的虚线箭头表示,表明类实现了接口所定义的契约。

继承和实现

java
class Bird extends Animal{}
class WideGoose implements IFly{}

作用

  • 结构可视化: 显示系统的静态结构,帮助理解系统的组成部分及其相互关系。
  • 设计沟通: 作为设计师、开发者之间沟通的工具,确保对系统架构有共同的理解。
  • 代码生成: 一些工具可以根据类图自动生成基础的代码框架。
  • 文档生成: 类图可以作为项目文档的一部分,帮助维护和理解系统。

设计模式分类

创建型模式(Creational Patterns)

创建型模式关注的是对象的创建过程,旨在隐藏创建逻辑、控制对象的创建方式,以及使系统独立于如何创建、组合和表示对象。这类模式让程序中的对象实例化过程更加灵活、可控制和易于管理。创建型模式包括:

结构型模式(Structural Patterns)

结构型模式关注的是如何组合类和对象以形成更大的结构,同时保证结构的灵活、高效和易于理解。它们通过封装、组合及代理等方式简化系统结构,使其更易于维护。结构型模式包括:

行为型模式(Behavioral Patterns)

行为型模式关注的是对象之间的职责分配以及它们之间的通信方式,用于描述在特定场景下对象之间如何交互和协作。这类模式定义了对象之间的责任分配和算法的组织方式,以达到特定的行为目的。行为型模式包括:

推荐书籍

《设计模式:可复用面向对象软件的基础》是设计模式领域的经典之作。

《Head First设计模式》:这本书以其独特的教学风格,通过图像、故事和实践例子,让设计模式的学习变得生动有趣,特别适合初学者。

《大话设计模式》:适合中文读者,以轻松幽默的语言讲解设计模式,使用C#作为示例语言,(我看的是Java溢彩加强版)。

《设计模式之禅》:深入浅出地介绍了多种设计模式,并提供了丰富的Java实战经验,适合有一定编程基础的读者。

《研磨设计模式》:内容严谨,注重实战,也是使用Java语言来阐述设计模式的运用。

《设计模式解析》:表述清晰易懂,提供完整的Java示例,是面向对象设计和学习模式的好选择。

《敏捷软件开发:原则、模式与实践》:结合敏捷开发、极限编程(XP)、面向对象编程(OOP)和设计模式,适合希望在敏捷环境中应用设计模式的开发者。

《Java与模式》:通过Java语言讲解设计模式,内容丰富且语言生动,有助于加深对Java标准库的理解。

Released under the MIT License.