设计模式
七大原则
这些原则主要的目的是提高代码的可维护性、可复用性和可扩展性
单一职责原则 (SRP):
概念: 一个类或模块应该有且仅有一个改变的理由。换句话说,一个类应负责一项明确的功能或职责。
应用: 通过拆分复杂的类为多个小类,每个类专注于单一职责,这样修改一处功能时,不会影响到其他职责。
开放封闭原则 (OCP ):
概念: 软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。这意味着可以在不修改原有代码的情况下进行功能扩展。
应用: 通过抽象和接口设计,使得新增功能可以通过增加新的类来实现,而不是修改现有类。
里氏替换原则 (LSP):
概念: 子类应当能够替换它们的基类并在软件中正确工作,而不会引起错误或异常行为。
应用: 确保子类不会改变父类的预期行为,保证多态性的安全使用。
依赖倒转原则 (DIP):
概念: 高层模块不应依赖于低层模块,二者都应依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
应用: 通过面向接口编程,而不是具体类,使得系统更加灵活,易于测试和维护。
接口隔离原则 (ISP):
概念: 客户端不应该被迫依赖它不使用的方法。接口应该尽可能细化,以满足不同客户端的具体需求。
应用: 将大接口拆分为多个小接口,每个接口服务于一个特定的客户类群。
迪米特法则 (LoD ) 或 最少知识原则:
概念: 一个对象应当对其他对象有最少的了解。也就是说,尽量减少对象之间的交互,仅通过接口通信。
应用: 减少类之间的耦合,每个类只和它的朋友(直接的朋友或通过参数传递的对象)交流,不和朋友的朋友交谈。
合成/聚合复用原则 (CARP ):
概念: 尽量使用对象组合,而不是类继承来达到复用的目的。即“要尽量使用对象组合,而不是类继承”。
应用: 优先考虑对象的组合(聚合或合成),这样可以更灵活地在运行时改变对象的行为,同时避免继承的复杂性。
UML类图
TIP
此文档图数据来源于《大话数设计模式》
基本构成元素
- 类(Class): 通常表示为一个矩形,分为三部分:
- 类名:位于顶部。
- 属性(Attributes):位于中部,可标注访问修饰符(如public, private, protected等)。
- 操作(Operations/Methods):位于底部,同样可标注访问修饰符。
- 接口(Interface): 与类类似,但顶部有<>标记以区分,强调它只包含操作定义,不包含属性。
- 包(Package): 用于组织和分组类和接口,通常用一个文件夹图标表示。
//类
abstract class Animal{}
interface IFly{
void fly();
}
关系
依赖关系(Dependency): 用虚线箭头表示,表明一个类依赖于另一个类的定义,通常是由于方法参数或局部变量的使用。
关联关系(Association): 用实线箭头表示类之间的结构关系。可以是单向或多向,可带有角色名和多重性标记(如1..*表示一对多关系)。
//关联关系
class Penguin extends Bird{
//在企鹅Penguin中,引用了气候Climate对象
private Climate climate;
}
//依赖关系
abstract class Animal {
public Metabolism(Oxygen oxygen,Water water){}
}
聚合关系(Aggregation): 一种特殊的关联,表示整体与部分的关系,用空心菱形的实线箭头表示,强调部分可以独立存在。
组合关系(Composition): 也是整体与部分的关系,但部分不能独立于整体存在,用实心菱形的实线箭头表示。
//聚合关系
class WideGooseAggregate{
//在雁群WideGooseAggregate中有大雁数组对象arrayWideGoose
private WideGoose[] arrayWideGoose;
}
//组合关系
class Bird{
//在Bird类中声明一个翅膀Wing和对象wing
private Wing wing;
//初始化时候,实例化翅膀,他们之间同时生成
public Bird(){
wing = new Wing();
}
}
继承/泛化关系(Inheritance/Generalization): 用带空心三角形的实线箭头表示,表示一个类继承另一个类的特性和行为。
实现关系(Realization): 用带空心三角形的虚线箭头表示,表明类实现了接口所定义的契约。
class Bird extends Animal{}
class WideGoose implements IFly{}
作用
- 结构可视化: 显示系统的静态结构,帮助理解系统的组成部分及其相互关系。
- 设计沟通: 作为设计师、开发者之间沟通的工具,确保对系统架构有共同的理解。
- 代码生成: 一些工具可以根据类图自动生成基础的代码框架。
- 文档生成: 类图可以作为项目文档的一部分,帮助维护和理解系统。
设计模式分类
创建型模式(Creational Patterns)
创建型模式关注的是对象的创建过程,旨在隐藏创建逻辑、控制对象的创建方式,以及使系统独立于如何创建、组合和表示对象。这类模式让程序中的对象实例化过程更加灵活、可控制和易于管理。创建型模式包括:
结构型模式(Structural Patterns)
结构型模式关注的是如何组合类和对象以形成更大的结构,同时保证结构的灵活、高效和易于理解。它们通过封装、组合及代理等方式简化系统结构,使其更易于维护。结构型模式包括:
行为型模式(Behavioral Patterns)
行为型模式关注的是对象之间的职责分配以及它们之间的通信方式,用于描述在特定场景下对象之间如何交互和协作。这类模式定义了对象之间的责任分配和算法的组织方式,以达到特定的行为目的。行为型模式包括:
- 责任链模式(Chain of Responsibility)
- 命令模式(Command)
- 解释器模式(Interpreter)
- 迭代器模式(Iterator)
- 中介者模式(Mediator)
- 备忘录模式(Memento)
- 观察者模式(Observer)
- 状态模式(State)
- 策略模式(Strategy)
- 模板方法模式(Template Method)
- 访问者模式(Visitor)
推荐书籍
《设计模式:可复用面向对象软件的基础》是设计模式领域的经典之作。
《Head First设计模式》:这本书以其独特的教学风格,通过图像、故事和实践例子,让设计模式的学习变得生动有趣,特别适合初学者。
《大话设计模式》:适合中文读者,以轻松幽默的语言讲解设计模式,使用C#作为示例语言,(我看的是Java溢彩加强版)。
《设计模式之禅》:深入浅出地介绍了多种设计模式,并提供了丰富的Java实战经验,适合有一定编程基础的读者。
《研磨设计模式》:内容严谨,注重实战,也是使用Java语言来阐述设计模式的运用。
《设计模式解析》:表述清晰易懂,提供完整的Java示例,是面向对象设计和学习模式的好选择。
《敏捷软件开发:原则、模式与实践》:结合敏捷开发、极限编程(XP)、面向对象编程(OOP)和设计模式,适合希望在敏捷环境中应用设计模式的开发者。
《Java与模式》:通过Java语言讲解设计模式,内容丰富且语言生动,有助于加深对Java标准库的理解。