重温设计模式系列 --- 完整精华篇
引言
软件开发过程中,我们经常会遇到各种设计问题,例如如何管理对象之间的关系、如何优化代码的可复用性和可维护性等等。为了解决这些问题,我们可以使用设计模式。
设计模式是一种被广泛接受的软件设计思想,它提供了一套通用的解决方案,可以帮助我们更好地解决常见的软件设计问题。设计模式是从实践中总结出来的,它不仅可以提高代码的可读性和可维护性,还可以提高开发效率和代码的可复用性。
常见设计模式原则
设计模式有常见的五大原则 - SOLID
- 单一职责原则(SRP)
- 开放封闭原则(OCP)
- 里氏替换原则(LSP)
- 接口隔离原则(DIP)
- 依赖倒置原则(ISP)
补充第六原则,迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least Knowledge Principle,LKP)
常见设计模式类型
- 创建型模式:负责对象的创建和初始化,共有5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
- 结构型模式:负责对象的组合,共有7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
- 行为型模式:负责对象之间的通信,共有11种:观察者模式、策略模式、迭代器模式、命令模式、责任链模式、模板方法模式、访问者模式、中介者模式、解释器模式、过滤器模式、备忘录模式。
目录
创建型模式
抽象工厂模式是一种创建型设计模式,它提供了一种封装一组相关或相互依赖对象创建过程的方法,使得我们可以在不知道具体实现细节的情况下,创建一系列相互协作的对象。
工厂方法模式是一种创建型设计模式,它提供了一种将对象的创建过程封装起来的方法,使得我们可以在不知道具体实现细节的情况下,创建各种不同类型的对象。
单例模式是一种保证一个类只有一个实例的模式,它可以避免多个实例造成的资源浪费和对象的不一致性。单例模式通常使用一个私有的构造函数和一个静态的实例变量来实现。
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式可以将复杂对象的构建过程抽象出来,从而使得系统更加灵活。
用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象。原型模式可以在运行时动态地创建对象,从而避免了静态工厂方法所带来的编译时耦合。
结构型模式
适配器模式是一种将一个类的接口转换成客户端所期望的另一种接口的模式,它可以让原本不兼容的类能够协同工作。这种模式可以避免因接口不匹配而导致的代码重构和重复开发。
装饰器模式是一种在运行时动态地给对象添加新的功能的模式,它通过将对象包装在一个装饰器中来实现。这种模式可以避免使用继承带来的复杂性和静态特性,提高代码的灵活性和可扩展性。
代理模式是一种结构型设计模式,它允许我们创建一个代理对象来控制对另一个对象的访问。代理对象可以充当原始对象的访问接口,从而控制对原始对象的访问。代理模式通常用于远程访问、延迟加载、访问控制等方面。
为一组复杂的子系统提供一个简单的接口,从而隐藏子系统的复杂性。外观模式可以降低客户端和子系统之间的耦合度,同时提高客户端的易用性。
桥接模式是一种将抽象部分与它的实现部分分离开来的模式,使它们可以独立地变化。这种模式可以避免因为实现细节的变化而导致的代码修改和重构。
组合模式是一种将对象组合成树形结构的模式,使得客户端可以像处理单个对象一样处理对象的组合。这种模式可以使得对象之间的关系更加清晰,提高代码的可读性和可维护性。
享元模式是一种结构型设计模式,用于优化对象的创建和使用。该模式通过共享相同的数据,来减少内存的使用和对象的创建。通常情况下,享元模式适用于存在大量相似对象的情况
行为型模式
观察者模式是一种对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会收到通知并自动更新。这种模式可以降低对象之间的耦合度,提高系统的灵活性和可扩展性。
策略模式是一种定义一系列算法的模式,它将每个算法封装在一个类中,并使它们可以互相替换。这种模式可以避免使用大量的条件语句和重复代码,提高代码的可维护性和可扩展性。
迭代器模式是一种访问一个聚合对象中的各个元素的方式,而又不需要暴露该对象的内部表示。这种模式可以让客户端透明地访问聚合对象中的元素,同时避免了聚合对象的数据结构对客户端的依赖。
将请求封装成对象,从而使不同的请求可以被不同的对象处理。命令模式可以将请求的发送者和接收者解耦,同时支持请求的撤销和重做
将请求的发送者和接收者解耦,通过一条由多个处理对象组成的链来处理请求。责任链模式可以根据需求动态地组合处理对象,从而实现请求的自动转发和处理。
定义一个操作中的算法骨架,将一些步骤延迟到子类中。模板方法模式可以提高代码的复用性和可维护性,同时可以避免子类中的代码重复
允许对象在内部状态发生改变时改变它的行为。状态模式将对象的行为和状态进行分离,从而将复杂的条件判断转化为简单的状态切换。
用一个中介对象来封装一系列的对象交互,从而使对象之间的交互松散耦合。中介者模式可以简化对象之间的交互,同时降低对象之间的依赖关系。
给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。解释器模式可以将复杂的语言转化为易于处理的数据结构,从而使得语言的解释更加容易。
访问者模式是一种行为设计模式,它可以让你将算法与它们操作的对象分离。这样,你可以在不修改对象结构的情况下,向现有的对象结构添加新的操作。
- 备忘录模式(Memento Pattern)
备忘录模式是一种行为型设计模式,它允许我们将对象的状态保存在备忘录对象中,从而可以在以后恢复对象的状态。该模式通常用于需要撤销、恢复操作的场景,例如文本编辑器、绘图应用等。备忘录模式通过将状态保存在备忘录对象中来实现状态的恢复,从而保证了对象的封装性和数据安全性。
参考资料