23种设计模式
2022-06-23 11:06:41 63 举报
AI智能生成
23种设计模式汇总总结
作者其他创作
大纲/内容
设计模式原则
开闭原则(Open Close Principle,OCP)
一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展
开闭原则即对拓展开放,对修改关闭,要想在功能新增的时候不修改原先的代码,即程序中使用的是抽象类或者接口,我们新增的子类或者实现,这样才能保障我们拓展功能的时候不用修改原先的代码,所以说抽象化是开闭原则的关键。
开闭原则即对拓展开放,对修改关闭,要想在功能新增的时候不修改原先的代码,即程序中使用的是抽象类或者接口,我们新增的子类或者实现,这样才能保障我们拓展功能的时候不用修改原先的代码,所以说抽象化是开闭原则的关键。
里氏替换原则(Liskov Substitution Principle,LSP)
所有引用基类(父类)的地方必须能透明地使用其子类的对象
基类存在的地方必定能被子类替换,且功能不会发生影响。里氏替换原则是“开-闭原则的补充”。
里氏替换通俗来讲就是子类可以拓展父类但是不能改变父类已确定的行为,包含以下四个含义:
基类存在的地方必定能被子类替换,且功能不会发生影响。里氏替换原则是“开-闭原则的补充”。
里氏替换通俗来讲就是子类可以拓展父类但是不能改变父类已确定的行为,包含以下四个含义:
- 子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法
- 子类中可以增加自己特有的方法
- 当子类重载父类方法时,形参的范围要比父类的形参范围大,这样别的类调用这个方法时会优先匹配父类的实现而不是子类的实现
- 当子类实现父类的抽象方法时,方法的返回值要比父类更严格,也可以说成更具体
依赖倒转原则(Dependence Inversion Principle,DIP)
抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程
依赖倒转原则要求我们在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型的转换等,而不要用具体类来做这些事情。
在实现依赖倒转原则时,我们需要针对抽象层编程,而将具体类的对象通过依赖注入(Dependency Injection, DI)的方式注入到其他对象中,依赖注入是指当一个对象要与其他对象发生依赖关系时,通过抽象来注入所依赖的对象。常用的注入方式有三种,分别是:构造注入,设值注入(Setter注入)和接口注入。构造注入是指通过构造函数来传入具体类的对象,设值注入是指通过Setter方法来传入具体类的对象,而接口注入是指通过在接口中声明的业务方法来传入具体类的对象。这些方法在定义时使用的是抽象类型,在运行时再传入具体类型的对象,由子类对象来覆盖父类对象。
开闭原则是目标,里氏代换原则是基础,依赖倒转原则是手段。
依赖倒转原则要求我们在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型的转换等,而不要用具体类来做这些事情。
在实现依赖倒转原则时,我们需要针对抽象层编程,而将具体类的对象通过依赖注入(Dependency Injection, DI)的方式注入到其他对象中,依赖注入是指当一个对象要与其他对象发生依赖关系时,通过抽象来注入所依赖的对象。常用的注入方式有三种,分别是:构造注入,设值注入(Setter注入)和接口注入。构造注入是指通过构造函数来传入具体类的对象,设值注入是指通过Setter方法来传入具体类的对象,而接口注入是指通过在接口中声明的业务方法来传入具体类的对象。这些方法在定义时使用的是抽象类型,在运行时再传入具体类型的对象,由子类对象来覆盖父类对象。
开闭原则是目标,里氏代换原则是基础,依赖倒转原则是手段。
单一职能原则(Single Responsibility Principle, SRP)
一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因
类的功能尽量单一,这样才能提高复用率。
单一职能原则是软件高内聚低耦合的指导方针。
类的功能尽量单一,这样才能提高复用率。
单一职能原则是软件高内聚低耦合的指导方针。
接口隔离原则(Interface Segregation Principle, ISP)
使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口
每一接口都应该承担一种相对独立的角色,该干的事情都敢,不该干的事情都不敢。
每一接口都应该承担一种相对独立的角色,该干的事情都敢,不该干的事情都不敢。
迪米特法则(Law of Demeter, LoD)
一个软件实体应当尽可能少地与其他实体发生相互作用。**
类与类之间的耦合度应尽量的低,这样如果类发生变化,影响才会最小。
不要和陌生人说话,只和你的直接朋友通信,直接朋友包含如下:
类与类之间的耦合度应尽量的低,这样如果类发生变化,影响才会最小。
不要和陌生人说话,只和你的直接朋友通信,直接朋友包含如下:
- 当前对象本身(this)
- 作为参数的对象
- 成员变量
- 集合成员变量中的元素
- 创建的对象
合成复用原则(Composite Reuse Principle, CRP)
尽量使用对象组合,而不是继承来达到复用的目的
通过继承来实现复用的问题是它会破坏封装性,子类能够看到基类的实现细节,自身类通过继承而来的基类方法是静态的(因为继承的类是确定的),而通过调用成员变量去执行成员变量的方法是动态的,因为成员变量可以是抽象化的,而实现类可以有很多种,每一种实现类的功能又不相同,但是他们可以被当作同一类型而被引入。
通过继承来实现复用的问题是它会破坏封装性,子类能够看到基类的实现细节,自身类通过继承而来的基类方法是静态的(因为继承的类是确定的),而通过调用成员变量去执行成员变量的方法是动态的,因为成员变量可以是抽象化的,而实现类可以有很多种,每一种实现类的功能又不相同,但是他们可以被当作同一类型而被引入。
自由主题
创建型(ConstructionalPatterns)
单例模式(SingletonPattern)(确保对象的唯一性)
定义
确保某个类只有一个实例,并且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
角色与理解
单例模式只包含一种角色那就是单例角色,Singleton(单例)。
单例模式有单个要点:
- 这个类只有一个实例
- 它自行创建这个实例
- 它自行向整个系统提供这个实例
核心代码
工厂模式(FactoryPattern)
简单工厂模式(SimpleFactoryPattern)
定义
定义一个工厂类,并提供一个抽象工厂方法,该方法通过传入不同的入参而制造出特定的产品,且所有产品具有共同的父类。
结构图
角色与理解
核心代码
工厂方法模式(FactoryMethodPattern)
定义
定义一个用于创建对象的接口,让子类决定将哪一个产品实例化。工厂方法模式让一个类的实例化延迟到工厂类的子类。工厂方法模式简称为工厂模式(Factory Pattern),又可称作虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorphic Factory Pattern)。
结构图
角色与理解
核心代码
抽象工厂模式(AbstractFactoryPattern)
定义
提供一个创建一系列相关或者相互依赖的类的工厂接口,他包含多个产品类的工厂方法,及一个工厂类能够创建多个产品。
结构图
角色与理解
核心代码
原型模式(PrototypePattern)(对象的克隆)
定义
拷贝原型实例来创建新的对象
结构图
角色与理解
ShallowClone与DeepClone
浅拷贝:当对象被复制时,只复制对象本身与值类型的成员变量,引用类型的成员变量没有被复制
深拷贝:当对象被复制时,对象本身、值类型成员变量、引用类型成员变量都会被复制,原型对象与复制对象完全独立
核心代码
建造者模式(BuilderPattern)(复杂对象的构建)
定义
将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示
结构图
角色与理解
核心代码
结构型(StructuralPatterns)
适配器模式(AdapterPattern)(不兼容结构的协调)
定义
将一个接口转换客户希望的另一个接口,使接口不兼容的那些类能够一起工作,又名包装器(Wrapper)。适配器模式可以为对象适配器模式,也可以是类适配器模式
结构图
角色与理解
核心代码
桥接模式(BridgePattern)(处理多个维度的变化)
定义
将俩个维度分离,使他们可以独立变化。又称为柄体(Handle and Body)模式或者接口(interface)模式。
结构图
角色与理解
核心代码
组合模式(CompositePattern)(树形结构的处理)
定义
组合多个对象形成树形结构以表示“整体-部分”的关系的层次结构。组合模式对叶子节点和容器节点的处理具有一致性,又称为整体-部分模式。
结构图
角色与理解
核心代码
装饰模式(DecoratorPattern)(拓展系统功能)
定义
动态的给一个对象增加一些职能,相对与生成子类更加灵活。
结构图
角色与理解
核心代码
注意事项
门面模式(FacadePattern)(子系统的统一入口)
定义
又称为门面模式,为子系统中一组接口提供一个统计的入口。外观模式定义了一个高层接口,方便了客户端与子系统之间的访问。
结构图
角色与理解
代理模式(ProxyPattern)(控制对象的访问)
定义
通过一个代理对象或者占位符来控制对原对象的访问。
结构图
角色与理解
核心代码
行为型(BehavioralPatterns)
责任链模式(ChainOfResponsibilityPattern)(请求的链式处理)
定义
将请求发送者和请求接受者解耦,让请求的接受者形成链式操作,所有人都能够接受接受到请求,直到有人处理请求。
结构图
角色与理解
核心代码
命令模式(CommandPattern)(请求发送者与请求接收者解耦)
定义
将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。其别名为动作(Action)模式或事务(Transaction)模式。
结构图
角色与理解
核心代码
解释器模式(InterpreterPattern)(树形结构的处理)
定义
定义一个语言的文法,并创建一个解释器去解释该语言中的句子,这里的“语言”是指使用规定格式和语法的代码。
结构图
角色与理解
核心代码
迭代器模式(IteratorPattern)(遍历聚合对象中的元素)
定义
提供一种方法来访问聚合对象中的元素,而不用暴露聚合对象的内部表示,其别名为游标(cursor)。
结构图
角色与理解
核心代码
中介模式(MediatorPattern)(协调多个对象间的交互)
定义
提供一个中介者完成对一系列操作的封装,降低对象间的系统耦合度。中介者模式又称为调停者模式。
结构图
角色与理解
核心代码
备忘录模式(MementoPattern)(撤销功能的实现)
定义
在不破坏封装的前提下,捕获对象的内部状态,并在对象外存储这个内部状态,以便将来回滚到这一状态。
结构图
角色与理解
核心代码
观察者模式(ObserverPattern)(对象间的联动)
定义
定义对象之间的一种一对多依赖关系,使得每一个对象发生状态的变化时,其相关依赖对象皆得到通知并被自动更新,又称为发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependence)模式。
结构图
角色与理解
核心代码
状态模式(StatePattern)(处理对象的多种状态及其相互转换)
定义
复杂对象不同状态下的行为封装与状态转换。
结构图
角色与理解
核心代码
策略模式(StrategyPattern)(算法的封装与切换)
定义
定义一系列算法,并将这些算法封装起来,并让他们能够相互替换,也称为政策模式(Policy)。
结构图
角色与理解
核心代码
模板方法模式(StrategyPattern)
定义
将一系列方法中的固定方法提取到抽象层,完成代码的复用,且通过子类的重写行为改变类的模板方法的功能的改变。
结构图
角色与理解
核心代码
访问者模式(VisitorPattern)(操作复杂对象结构)
定义
被访问对象放开胸怀,接受不同的访问者进行访问,且访问者对被访者数据进行处理。
结构图
角色与理解
核心代码
收藏
0 条评论
下一页