软件设计原则和设计模式

这个作业属于 <2022软件代码开发技术>
这个作业要求在哪 读书笔记----软件设计原则、设计模式
这个作业的目标 学习设计原则和设计模式

参考书籍《大话设计模式》---- 程杰


一、设计原则

 
六大设计原则

设计原则 内容
开闭原则 一个软件实体,如类、模块和函数应对外扩展开发,对内修改关闭
单一职责原则 一个类只允许有一个职责,即只有一个导致该类变更的原因
依赖倒置原则 依赖抽象而不依赖实现,抽象不应该依赖细节,细节应该依赖抽象。高层和低层模块都应依赖抽象
接口分离原则 多个特定的客户端口要好于一个通用性的总接口
迪米特法则 一个对象应该与尽可能少的对象接触,只接触那些真正需要接触的对象
里氏替换原则 子类对象可以替换其父类对象,而不影响程序执行效果

 

  • 开闭原则
    优点:开闭原则要求可以在不改动原有代码的前提下给程序扩展功能。增加了程序的可扩展性,同时也降低了程序的维护成本。
    理解:通过抽象构建框架,用实现扩展细节。通过实现抽象出来的接口的方式来实现不改动原有代码,通过新增实现功能扩展。

 

  • 单一职责原则
    优点:类与方法的职责划分清晰,可以提高代码的可读性,还能实际性地降低程序出错的风险,降低程序维护成本。
    理解:原则要求实现职责单一划分清晰,这样编写出的代码逻辑结构清晰,利于降低程序错误和bug的追踪。

 

  • 依赖倒置原则
    优点:通过抽象来搭建框架,建立类与类的联系,以减少类间的耦合性,且扩展性更高,便于维护。
    理解:进行抽象时不应依赖细节,细节的实现依赖抽象。业务层属于上层模块,逻辑层和数据层应属于底层。
     
  • 接口分离原则
    优点:避免同一接口里面包含不同类职责的方法,接口责任划分更明确,符合高内聚低耦合思想。
    理解:接口不应庞大臃肿,应尽量细化接口,接口内方法应尽可能少,实现高内聚低耦合,但也不能太小,不然可能导致接口数量多,设计复杂,加大设计负担。
     
  • 迪米特法则
    优点:降低类与类之间的耦合,减少类与类之间的关联程度,让类与类之间的协作更直接。
    理解:迪米特法则要求对象应只接触真正需要接触的对象,减少不必要的接触对象,减低类与类之间耦合性。
     
  • 里氏替换原则
    优点:可以检验继承使用的正确性,约束继承在使用上的泛滥
    理解:里氏替换原则表明了继承的使用时机,在继承机制中,子类可以实现父类的抽象方法或增加自己特有的方法,但是不能重写父类的非抽象方法,否则该继承关系就不是一个正确的符合里氏替换原则的继承关系。

二、创建型

1、单例模式

单例模式是设计模式中最简单的模式之一。
将类的构造函数设为私有的,外部类就无法调用该类的构造函数,无法生成多个实例。
这时该类自身必须定义一个静态私有实例,并向外提供一个静态的共有函数用于创建或获取该静态私有实例。
 
单例模式结构如下图所示。

2、原型模式

用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。原型实例指定了要创建的对象的种类。
但需要为类配置一个clone方法,且因为clone方法位于类的内部,当对已有类进行改造时,需要修改代码,违背了开闭原则。

 
原型模式结构如下图所示。

3、简单工厂模式

工厂模式用来解决需要生成复杂对象的情况。

复杂对象指的是类的构造函数参数过多等对类的构造有影响的情况,因为类的构造过于复杂,如果直接在其他业务类内使用,则两者耦合过高,后续业务更改,就需要在任何引用该类的代码处进行修改。
按实际业务场景划分,工厂模式有三种不同实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。

如果需要创建的对象不多,只需一个工厂类即可,这种模式为“简单工厂模式”。
简单工厂模式中创建实例的方法通常为静态方法,因此简单工厂模式又叫静态工厂方法模式。

 
简单工厂模式结构如下图所示。

4、工厂方法模式

简单工厂模式每增加一个需要工厂的对象就要增加一个具体对象类和一个对应的具体工厂类,增加了复杂度,且违背了“开闭原则”。

“工厂方法模式”是对简单工厂模式的进一步抽象化,可以使系统在不修改原有代码的基础上增加新的对象,即满足了“开闭原则”。

 
工厂方法模式结构如下图所示。

5、抽象工厂模式

抽象工厂模式同工厂方法模式一样,也是由抽象工厂、具体工厂、抽象产品和具体产品等 4 个要素构成,但抽象工厂中方法个数不同,抽象产品的个数也不同。现在我们来分析其基本结构和实现方法。
 
抽象工厂模式结构如下图所示。

6、建造者模式

建造者模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。

 
建造者模式结构如下图所示。

  • 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。
  • 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
  • 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
  • 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。

三、结构型

1、代理模式

因为某些原因需要给某对象提供一个代理以控制对该对象的访问。

  • 抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
  • 真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
  • 代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。

2、适配器模式

将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的类能一起工作。

适配器模式分为:类适配器模式和对象适配器模式。
类适配器通过多重继承方式实现。
 

  • 类适配器模式如下图所示。

     
  • 对象适配器如下图所示。

     
    适配器应用场景如下图。

3、装饰模式

在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。

装饰模式结构如下图所示。

4、桥接模式

将抽象与与实现分离,使它们可以独立变化。

桥接模式结构如下图所示。

5、外观模式

外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

外观模式结构如下图所示。
 

6、组合模式

组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构型设计模式。

组合模式结构如下图所示。
 

7、享元模式

享元(Flyweight)模式的定义:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。

享元模式结构如下图所示。
 


四、行为型

1、模板方法模式

模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。

模板方法模式结构如下图所示。
 

2、策略模式

策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

策略模式结构如下图所示。
 

3、命令模式

命令(Command)模式的定义如下:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。

命令模式结构如下图所示。
 

4、责任链模式

责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

责任模式结构如下图所示。
 

5、状态模式

状态(State)模式的定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。

状态模式结构如下图所示。
 

6、观察者模式

观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。

观察者模式结构如下图所示。
 

7、中介者模式

中介者(Mediator)模式的定义:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。

中介者模式结构如下图所示。
 

8、迭代器模式

迭代器(Iterator)模式的定义:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。

迭代器模式结构如下图所示。
 

9、访问者模式

访问者(Visitor)模式的定义:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离,是行为类模式中最复杂的一种模式。

访问者模式结构如下图所示。
 

10、备忘录模式

备忘录(Memento)模式的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。

备忘录模式结构如下图所示。
 

11、解释器模式

解释器(Interpreter)模式的定义:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。也就是说,用编译语言的方式来分析应用中的实例。这种模式实现了文法表达式处理的接口,该接口解释一个特定的上下文。

解释器模式结构如下图所示。
 

 

思考与总结

思考
学习完后,我想到之前课设做的在线聊天系统的软件中,在客户进行大文件如视频等的传输的应用场景中就可以使用代理模式进行设计开发。同时对应视频播放器,我也考虑到可以用适配器模型来实现不同格式的音频文件在视频播放器的播放。
总结
不同设计模式都有适合其的不同应用场景,有些设计模式可能不满足设计原则,在不考虑后续维护问题上一些设计模式在特定场合仍旧适用,但是有些不符合设计原则的设计模式可能不再适用,因此选择适合的设计模式取决于应用的场景,但而在一些特定的、设计模式无法满足的应用场景下,就需要我们根据设计原则和具体开发场景进行合理设计安排。

截图

posted @   chamj  阅读(97)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示