第7章面向对象设计常用的设计模式

7.1 设计模式概述

7.2 单例模式

(1)模式名称
单例模式。
(2)问题与分析
问:
对于调用者,如何才能做到确保代码中的某个类只存在一个实例,而且实例一旦创建,就可以向整个运行程序提供全局访问的方法,由全局程序共享。
答:
需要定义一个特殊的类,该类能够实现这样几种特性。一是这个类只能有一个实例,即便再次创建实例,该类也能够保证返回的是同一个实例对象,而不是再创建出的新实例对象。二是这个类必须能够在内部控制实例的创建,而不是放给调用者任意创建。三是这个类能够被全局访问和共享。
(3)解决方案
定义一个单例类A,该类是私有可见度(Private),使得在类外部不可以直接创建类实例,类定义一个静态方法GET_INSTANCE,用于通过调用类来创建和返回该类的唯一的实例,而不是通过调用对象。
第一次调用GET_INSTANCE方法时将创建唯一的实例,第二次以上调用GET_INSTANCE方法时,方法会返回第一次创建时的实例对象,这样就保证了系统中只存在唯一的实例对象。

7.3 简单工厂模式

1)模式名称
简单工厂模式。
(2)问题与分析
问:
对于调用者,如何才能做到不用关心制造的细节,只要传入一个正确的参数,就可以获取所需要的对象?
答:
我们需要一个工厂一样的类对象,根据传入的参数,生产出需要的对象实例。
(3)解决方案
定义一个工厂类A,它可以根据参数的不同来返回不同类的实例,比如传入工厂类方法参数字符串“B1”,类工厂就会创建对应的对象B1。
被创建的实例通常都具有共同的父类,如抽象产品类B。在简单工厂模式中,用于创建实例的方法可以是静态方法(即不用创建工厂类对象实例就可以开工生产的模式),简单工厂模式又被称为静态工厂方法(StaticFactory Method)模式。

7.4 适配器模式

出国旅游或出差时会发现,很多国家的电压和插头的标准与国内的都不一样,这就需要我们再购买一个带插头的转接头,即适配器。

(1)模式名称
适配器模式。
(2)问题与分析
问:
如何才能把一个程序或类的调用方式转换成调用程序所需要的形式,从而使两个不匹配的类或者代码能够一起工作?
答:
需要在两个程序或者类之间,设置一个新的类,用于翻译两者之间不同的调用方式。
(3)解决方案
为了使得两个类能够互相调用,我们需要增加一个适配器类来解决调用接口不兼容的问题,以使得原本没有直接关系的类可以进行互相调用的操作。

7.5 桥接模式

奥地利设计生产的斯太尔(AUG)步枪,采用了模块化设计,短时间内可以将枪管和部件进行拆卸和组合,使得它可以变成冲锋枪、突击步枪、轻机枪,可以用于巷战、进攻、压制等不同目的的作战

(1)模式名称
桥接模式。
(2)问题与分析
问:
如何避免用复杂的继承来描述业务?如何用组合和关联来提高灵活性?
答:
采用组合来替代多层的继承,将类之间的继承关系转换为动态的组合关系,使得系统更加灵活,并且易于扩展,同时还可以降低系统中类定义的数量。
(3)解决方案
通过业务分析,将业务描述从多个维度拆分并展开,使对象可以在不同的维度上独立变化,然后再根据需要组合这些维度,形成所需要的结构模型。也就是通过先拆再连的过程,达成灵活组合的目的。

7.6 外观模式

7.7 观察者模式

当一个对象的状态发生改变时,这个对象相关依赖的所有对象都可以得到通知并能够自动更新的行为模式就是观察者模式(Observer Pattern)。

(1)模式名称
观察者模式。
(2)问题与分析
问:
当一个对象状态发生改变之后,应如何向其他相关的对象发送变化的通知呢?
答:
定义对象间的一对多的依赖关系,当一个对象(被观察者)的状态发生改变时,所有依赖于它的对象(观察者)都可以得到通知并执行相关的动作。
(3)解决方案
定义一个被观察者和多个观察者,并将这些观察者联系到相应的被观察者,当被观察者的状态发生改变时,调用方法逐一地通知观察者对象。

我们利用SAP ABAP的Event(事件功能),那么我们可以更方便地获得相同的效果。
如图7-77所示是采用Event事件的过程,其中的类关系具体如下。
·被监听者类ZCL_SUBJECT设定了事件STATUS_CHANGED。
·观察者类ZCL_OBSERVER,观察并响应被监听者ZCL_SUBJECT的事件。

7.8 策略模式

义一系列的算法,将每一个算法都封装起来,并根据需要可以灵活调用或替换算法,让算法独立于我们的调用程序,那么这样的一个模式就是策略模式(Strategy Pattern)。

(1)模式名称
策略模式。
(2)问题与分析
问:
当调用者使用算法进行计算时,怎样才能不影响调用者的调用,而对算法进行替换操作?
答:
将算法的定义与使用分开,让调用者依赖于抽象的算法定义的抽象类(依赖倒置原则),当出现新的算法时,只需要增加一个新的实现类即可。
(3)解决方案
定义一个抽象的算法类,然后定义一系列的算法实现类,这些实现类可以相互替换,这样就可以让算法独立于调用者的调用。

7.9 设计模式总结

采用设计模式时有如下建议。
1)SAP ABAP中使用设计模式要采用面向对象的ABAP,并充分利用动态参数(括号运算符)功能,根据动态传入的类类型,在运行时动态创建对象。
2)SAP ABAP中要采用自定义数据库表来存储业务配置,这样才能发挥出设计模式的业务可配置的灵活性。
3)对复杂的和上层的业务逻辑考虑使用设计模式,对简单的、底层的程序实现则不用考虑。
4)首先考虑业务实现,然后再看能否应用设计模式,设计模式是为人服务的,不要为了设计模式而设计模式。
5)设计模式是为了能够达到代码的重用和问题的解耦,减少复杂度和相互依赖,提高程序的稳定性和可维护性。
6)能用简单的模式解决的问题就不要引入复杂的模式。
7)相比实现一个模式,遵守面向对象的基本原则往往是更重要的。
8)设计模式不是“银弹”,它们能够帮助设计出稳定的程序,但不能解决所有的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/418495.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

std::atomic

一、概述 std::atomic 是C11引入的一个模板类,用于提供原子操作的类型。在多线程编程中,当多个线程同时访问同一块数据时,可能会导致数据竞争和不确定的行为。std::atomic 可以用来创建原子类型的变量,保证对该变量的操作是原子的…

蓝桥杯练习题-穷举模拟

📑前言 本文主要是【穷举模拟】——蓝桥杯练习题-穷举模拟的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄…

Spring DI

目录 什么是依赖注入 属性注入 构造函数注入 Setter 注入 依赖注入的优势 什么是依赖注入 依赖注入是一种设计模式,它通过外部实体(通常是容器)来注入一个对象的依赖关系,而不是在对象内部创建这些依赖关系。这种方式使得对象…

基于C++11的数据库连接池【C++/数据库/多线程/MySQL】

一、概述 概述:数据库连接池可提前把多个数据库连接建立起来,然后把它放到一个池子里边,就是放到一个容器里边进行维护。这样的话就能够避免数据库连接的频繁的创建和销毁,从而提高程序的效率。线程池其实也是同样的思路&#xf…

OCR识别网络CRNN理解与Pytorch实现

CRNN是2015年的论文“An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition”提出的图像字符识别网络,也是目前工业界使用较为广泛的一个OCR网络。论文地址:https://arxiv.org/…

OpenHarmony AI框架开发指导

一、概述 1、 功能简介 AI业务子系统是OpenHarmony提供原生的分布式AI能力的子系统。AI业务子系统提供了统一的AI引擎框架,实现算法能力快速插件化集成。 AI引擎框架主要包含插件管理、模块管理和通信管理模块,完成对AI算法能力的生命周期管理和按需部…

检索增强(RAG)的方式---重排序re-ranking

提升RAG:选择最佳嵌入Embedding&重排序Reranker模型 检索增强生成(RAG)技术创新进展:自我检索、重排序、前瞻检索、系统2注意力、多模态RAG RAG的re-ranking指的是对初步检索出来的候选段落或者文章,通过重新排序的方式来提升检索质量。…

红包封面免费送1000个,你设计,我出额度

相信最近大家或多或少都知道了吧,腾讯又又又给大家,准确的说是给一年勤奋的公众号/视频号博主一个福利 根据不同博主的粉丝、更新频度以及作品质量,给力博主们免费制作红包封面的福利 比如我这个号,有6000额度 那这6000个&#…

从规则到神经网络:机器翻译技术的演化之路

文章目录 从规则到神经网络:机器翻译技术的演化之路一、概述1. 机器翻译的历史与发展2. 神经机器翻译的兴起3. 技术对现代社会的影响 二、机器翻译的核心技术1. 规则基础的机器翻译(Rule-Based Machine Translation, RBMT)2. 统计机器翻译&am…

【STM32】STM32学习笔记-I2C通信协议(31)

00. 目录 文章目录 00. 目录01. I2C简介02. I2C主要特点03. I2C硬件电路04. I2C时序基本单元05. I2C时序波形图06. 附录 01. I2C简介 I2C(Inter-Integrated Circuit)总线是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接…

【高等数学之定积分】

一、什么是定积分? 我们第一次新手司机开车从某一地方到(一数)家,自始至终保持着匀速行驶,那么这个过程所经历的路程是什么呢?用速度-时间函数图像来表示一下,我们发现其实就是其曲线下的面积。 第二次开车我们已经有了一定的经验&#xff…

vivado 定义板文件板

定义板文件板 &#xff1c;board&#xff1e;标记是板文件的根。它包括识别基本信息的属性关于董事会。 <board schema_version"2.1" vendor"xilinx.com" name"kc705" display_name"Kintex-7 KC705 Evaluation Platform" url&qu…