【软设】知识点汇总4

1 设计模式

1.1 创建型设计模式

  1. 抽象工厂模式:提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。它强调一系列相关的产品对象(属于同一产品族)一起使用,并且创建对象时存在大量重复的代码。这种模式的优点在于将具体产品在应用层代码隔离,无需关心创建细节,将一系列的产品族统一到一起创建。但缺点是规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口,增加了系统的抽象性和理解难度。(生成系列对象)实例:假设我们有一个系统需要支持多种操作系统平台(如Windows和Linux),每种平台都有其特定的UI组件(如按钮、文本框等)。使用抽象工厂模式,我们可以定义一个抽象工厂接口,每个平台实现自己的具体工厂,负责创建该平台特有的UI组件。这样,当我们需要切换平台时,只需更换具体的工厂实现即可,而无需修改客户端代码。                                   
  2. 生成器模式(Builder Pattern):也叫创建者模式,它将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。生成器模式适用于当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。生成器模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。(复杂对象构建 )实例:考虑一个复杂的对象,如电脑,它由多个部件组成(如CPU、内存、硬盘等)。使用生成器模式,我们可以定义一个电脑生成器,逐步构建电脑对象,每次只关注一个部件的创建和组装。这样,客户端可以灵活地选择需要的部件,生成符合自己需求的电脑对象。          
  3. 工厂方法模式:定义了一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。它的主要优点包括用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则。然而,每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。(动态生产一个对象 )实例:在一个日志系统中,我们需要支持多种日志记录方式(如文件记录、数据库记录等)。使用工厂方法模式,我们可以定义一个日志记录工厂的接口,每种记录方式实现自己的具体工厂方法。这样,当需要添加新的记录方式时,只需添加新的工厂方法实现,而无需修改原有代码。
  4. 原型模式:是一种对象创建型模式,通过克隆方法所创建的对象是全新的对象,它们在内存中拥有新的地址。原型模式可以方便快速的保存大对象的运行时状态,并且可以通过不同的方式修改得到一系列相似但不完全相同的对象。(克隆对象)实例:在一个需要频繁创建相似对象的场景中,如游戏中的角色创建,可以使用原型模式。我们可以定义一个角色原型,包含角色的基本属性和技能。当需要创建新角色时,只需复制这个原型对象,并对其进行必要的修改即可。这样可以避免重复创建相同结构的对象,提高性能。
  5. 单例模式:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。(单实例)实例:在一个配置管理系统中,配置信息需要在整个应用程序中共享,并且只应该有一个实例。使用单例模式,我们可以确保配置管理器只有一个实例,并提供一个全局访问点。这样,无论应用程序中的哪个部分需要访问配置信息,都可以通过这个全局访问点来获取,避免了多个实例导致的配置不一致问题。

 1.2 结构型设计模式

  1. 适配器模式将一个类的接口变换成客户端所期待的另一种接口,使原本因接口不匹配无法一起工作的两个类可以协同工作。适配器模式分为类适配器和对象适配器两种,类适配器采用继承的方式,而对象适配器采用组合的方式。(转换接口)实例:假设我们有一个旧式的打印机,它只接受特定格式的打印命令。然而,新的应用程序使用不同的打印命令格式。这时,我们可以创建一个适配器,它将新的打印命令格式转换为旧式打印机所能理解的格式。这样,新的应用程序就可以通过适配器与旧式打印机进行通信。
  2. 桥接模式:将抽象与实现分离,使它们可以独立变化。桥接模式使用组合关系替代继承关系,降低了抽象和实现这两个维度的耦合度,从而增加了系统的灵活性。(继承树拆分 )  实例:考虑一个图形用户界面(GUI)系统,其中有多种不同的界面风格和多种不同的图形元素。使用桥接模式,我们可以将界面风格和图形元素分离开来。这样,当我们需要添加新的界面风格或新的图形元素时,只需要在相应的部分进行扩展,而不需要修改已有的代码。      
  3. 组合模式:允许你将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和复合对象的使用具有一致性。(树形目录结构)实例:在一个文件系统中,目录和文件都可以被看作是对象。目录可以包含其他目录和文件,形成一个树形结构。使用组合模式,我们可以将目录和文件都视为相同的接口,这样无论是对目录还是文件进行操作,都可以使用相同的代码。                                                                       
  4. 装饰模式动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。(附加责任 )实例:以咖啡为例,基本的咖啡可以添加不同的调料,如牛奶、糖、奶油等,以改变其口味。每种调料都可以看作是一个装饰器,它们都可以添加到基本咖啡上,形成不同风味的咖啡。这就是装饰模式的一个实际应用。                                                                                              
  5. 外观模式:为子系统中的一组接口提供了一个统一的高层次接口,使得子系统更容易使用。外观模式定义了一个高层接口,让子系统更容易使用。(对外统一接口 )实例:考虑一个复杂的电视遥控器,它有许多不同的按钮和功能。为了简化用户的操作,我们可以设计一个外观类,它只暴露一些常用的功能,如开关机、切换频道等。用户只需要与这个外观类进行交互,而不需要关心遥控器内部的复杂结构。                                                       
  6. 享元模式:运用共享技术有效地支持大量细粒度的对象,避免大量相似对象的内存开销。常用于系统底层开发,解决系统性能问题。(文章共享文字对象 )实例:在一个在线游戏中,有许多相同的角色或怪物。为了节省内存,我们可以使用享元模式。每个角色或怪物的基本属性和行为都被存储在一个共享的对象中,而每个具体的实例只存储其独特的数据(如位置、状态等)。这样,即使游戏中有大量的角色或怪物,也不会消耗过多的内存。                                                                                                                               
  7. 代理模式为某对象提供一个代理,以控制对该对象的访问。代理模式的主要优点包括中介作用和保护目标对象,扩展目标对象的功能,降低系统的耦合度等。(快捷方式 ) 实例:假设我们有一个远程的视频会议系统。用户并不直接与视频会议服务器进行通信,而是通过一个代理来进行。这个代理负责处理网络连接、数据编码解码等复杂的工作,用户只需要与代理进行简单的交互即可。这就是代理模式的一个应用。

1.3 行为型设计模式

  1. 责任链模式:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链。当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。责任链模式降低了对象之间的耦合度,增强了系统的可扩展性和灵活性。实例:在一个企业中,请假申请需要按照特定的流程进行审批。例如,员工向直属经理提交请假申请,如果经理无法批准(如请假天数超出其权限),则申请会自动转交给上级审批,直到找到能够批准的决策者为止。这就是责任链模式的应用,每个审批者都是链中的一个节点,负责处理自己能够处理的请求,否则将请求传递给下一个节点。                           
  2. 命令模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。命令模式可以降低系统的耦合度,增加或删除命令比较方便,同时可以实现宏命令,以及方便地实现 Undo 和 Redo 操作。 实例:在一个图形编辑软件中,用户可以通过点击按钮或选择菜单项来执行各种命令,如“画线”、“填充颜色”等。每个命令都被封装成一个对象,并存储在命令队列中。当用户触发某个命令时,软件会调用该命令对象的execute方法,执行相应的操作。这样,软件可以灵活地添加、删除或修改命令,而无需修改客户端代码。                            
  3. 解释器模式给定一个语言(表达式),定义它的文法的一种表示,并定义一个解释器,使用该解释器来解释语言中的句子(表达式)。解释器模式在处理需要解析的特定文法或表达式时非常有用。实例:在一个编程语言的编译器中,解释器模式用于解析和执行源代码。编译器首先将源代码解析成抽象语法树(AST),然后遍历AST并调用相应的解释器对象来执行每个节点上的操作。这样,编译器可以灵活地支持不同的语法规则和语义解释。                         
  4. 迭代器模式提供一种顺序访问集合/容器对象元素的方法,而又无须暴露集合内部表示。迭代器模式可以为不同的容器提供一致的遍历行为,而不用关心容器内容元素组成结构。           实例:在一个图书管理系统中,用户需要遍历图书馆中的所有书籍。为了隐藏遍历的具体实现细节,系统提供了一个迭代器接口,并实现了多个具体的迭代器类(如按书名排序迭代器、按作者排序迭代器等)。用户只需通过迭代器接口来遍历书籍,而无需关心具体的遍历方式。                                                                                                                                                         
  5. 中介者模式用一个中介对象来封装一系列的对象交互,使各对象不需要显式地相互引用,从而使其耦合松散,并且可以独立地改变它们之间的交互。中介者模式降低了对象之间的耦合度,使系统更加灵活和易于维护。 实例:在一个聊天室系统中,多个用户之间需要进行实时通信。为了避免用户之间直接通信导致的复杂性(如消息同步、冲突解决等),系统引入了一个中介者对象。用户将消息发送给中介者,由中介者负责将消息转发给其他用户。这样,用户之间的通信被中介者所管理,降低了系统的耦合度                                                                 
  6. 备忘录模式:属于行为型模式,它通过在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。备忘录模式可以用于保存对象的状态,并在需要时恢复到该状态,例如在游戏中保存进度。 实例:  在一个在线购物系统中,用户可以将自己感兴趣的商品添加到购物车中,并在稍后进行结算。为了保存用户的购物状态,系统使用备忘录模式。当用户添加商品到购物车时,系统会创建一个备忘录对象,并保存购物车的当前状态。如果用户关闭浏览器或退出系统,下次再打开时可以通过加载备忘录对象来恢复之前的购物状态。                                                                                                                                                
  7. 观察者模式:定义对象之间的一对多依赖关系,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。观察者模式广泛应用于事件驱动编程中,如GUI编程、异步消息处理等。实例:在一个股票交易系统中,股票价格会实时变动。多个投资者关心特定股票的价格变化,并希望在价格发生变化时得到通知。系统使用观察者模式来实现这一功能。每个投资者都是一个观察者对象,他们将自己注册到股票对象上。当股票价格发生变化时,股票对象会通知所有注册的观察者对象,使它们能够做出相应的反应。                                                          
  8. 状态模式允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类。状态模式使得对象的行为与其状态相关,当状态发生变化时,行为也随之变化。 实例:在一个游戏角色系统中,角色有多种状态(如空闲、移动、战斗等),每种状态下角色的行为有所不同。使用状态模式,可以为每种状态定义一个状态类,并在角色类中维护一个当前状态对象的引用。当角色的状态发生变化时,只需更新当前状态对象的引用即可,无需修改角色类的其他部分。                                                                                                                                 
  9. 策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式使得算法可以独立于使用它的客户端变化,从而使得系统更加灵活和可维护。实例:在一个电商平台的促销活动中,有多种促销策略(如满减、折扣、赠品等)。使用策略模式,可以为每种促销策略定义一个策略类,并在促销活动中根据需要选择使用哪种策略。这样,电商平台可以灵活地添加、删除或修改促销策略,而无需修改其他部分的代码。                                                          
  10. 模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。实例:在一个软件开发团队中,每个项目都需要进行需求分析、设计、编码、测试等阶段。虽然不同项目的具体实现细节可能有所不同,但整体流程是相似的。使用模板方法模式,可以定义一个包含所有阶段的抽象类,并在具体项目中实现具体的阶段方法。这样,每个项目都可以遵循相同的流程进行开发,同时保持各自的灵活性。                                                                                                             
  11. 访问者模式:是一种将数据操作与数据结构分离的设计模式,它使得在不改变数据结构的前提下,可以添加新的操作。访问者模式适用于数据结构相对稳定,而操作易于变化的情况。   实例:在一个复杂的对象结构中(如树形结构),可能需要对结构中的对象进行多种不同的操作。使用访问者模式,可以定义一个访问者接口,并为每种操作实现一个具体的访问者类。然后,通过遍历对象结构并调用每个对象的accept方法,将访问者对象传递给对象进行处理。这样,可以在不修改对象结构的情况下添加新的操作。

2 面向对象

动态绑定:运行时

静态绑定:编译时

2.1 面向对象分析

  1. 认定对象
  2. 组织对象
  3. 对象间的相互作用
  4. 基于对象操作

2.2面向对象设计

  1. 识别类及对象
  2. 定义属性
  3. 定义服务
  4. 识别关系
  5. 识别包 

 3 uml中的图

类图(Class Diagram):描述一组对象、接口、协作和它们之间的关系,给出系统的静态设计视图。

对象图(Object Diagram):描述系统中的多个对象在某一时刻的状态

用例图(Use Case Diagram):从用户角度描述系统功能,描述一组用例、参与者及它们之间的关系 

序列图(Sequence Diagram):主要用于描述对象之间传送消息的时间顺序。它是对对象之间交互行为的可视化表示,可以清晰地展示系统中对象间的通信顺序和消息传递关系。

通信图(Communication Diagram):在UML(统一建模语言)中强调参与一个交互的对象的结构组织,适合在分析活动中使用,用于描述少量对象的简单交互。通信图与顺序图是同构图,都用于描述交互,但侧重点有所不同。顺序图清晰地显示了时间次序,而通信图则清晰地显示了对象间关系。

状态图(Statechart Diagram):主要用于描述一个实体(例如一个对象或系统)基于事件反应的动态行为。它展示了该实体如何根据当前所处的状态对不同的事件做出反应,以及这些状态之间的转移情况。 

活动图(Activity Diagram):描述系统中的过程和活动,通常用来描述系统的业务流程。

构件图:展现一组构件之间的组织和依赖

组合结构图:它表示某一对象的内部结构,其内部由一组小对象组成。这种图强调对象内部的组成对象,一般在业务系统中对象是平等的,而组合的结构就比较少一些。它的结点元素包括部件、端口、合作、合作使用,连接元素包括连接件、角色绑定。通过组合结构图,可以清晰地了解对象内部的组成和交互方式。

部署图:是面向对象系统的物理方面建模的两种图之一。它描述系统硬件的物理拓扑结构以及在此结构上执行的软件。部署图可以显示计算节点的拓扑结构和通信路径、节点上运行的软件组件。在UML中,部署图显示了系统的硬件和安装在硬件上的软件,以及用于连接异构计算机之间的中间件。通过部署图,可以清晰地了解系统的物理部署情况,包括硬件和软件之间的交互关系。

包图:用于表示系统的包和包之间的关系,是UML中的一种结构图。包是对系统的逻辑组织单元的抽象,可以包含类、接口、枚举等。

  • 21
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mikuc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值