软件构造学习笔记-第九周、第十周

因为本周五开始五一假期,所以只有一节软件构造课。因为内容还属于创建模式、结构模式、行为模式。将该堂课的内容整合到本博客中。本周的重点是程序开发模式,在写代码之前首先充分考虑采用哪种模式更有利于开发、维护。采用合适的设计模式帮助理清思路,明确目标,有“事半功倍”之效果。编写可复用代码需要更多的精力投入。

框架层面的复用

1.可分为白盒框架和黑盒框架
白盒框架:通过子类型和重写方法实现扩展,对应模板模式
黑盒框架:通过插件接口实现扩展(本质上是委托),对应策略模式和观察模式
2.复用白盒框架后,通过创建子类进行调用。

复用黑盒调用后,通过框架程序进行调用。

3.白盒框架和黑盒框架可复用代码的位置
黑盒的可复用代码在框架中,插件是自定义部分
白盒框架的可用代码是子框架的父类

结构模式

1.适配器Adapter
① 使用具有中转功能的接口,将不匹配的接口统一(将某个类或接口转换为用户期望的其他形式)

②Rectangle类是adapter,LegacyRectangle是adaptee

2.装饰器Decorator
①让类的操作产生更多的特性,对每一个特性构造子类,通过委派机制增加到对象上。
②例子:stack的三种附加功能

上面是接口,左边是被扩充的类,右边是装饰。装饰类中将基础操作,比如push、pop、size操作,通过引用委托到左边的被扩充类完成。
装饰类委托的类不同,可以实现层层装饰的效果。比如在实现SecureStack时,将其父类StackDecorator指向UndoStack,则实现的SecureStack就同时具有了UndoStack功能。如果同时,将UndoStack的父类指向LockedStack,UndoStack就具有了LockedStack功能。
装饰类只能使用接口中的操作。
具体例子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注:t无法使用undo方法,只能使用接口中的push、pop、size方法。
3.外观模式Facade
①组合接口成一个统一的接口,Lab3中有体现。
4.代理(Proxy)模式
①某个对象比较私密/敏感/浪费资源,不希望被客户端直接访问。设置proxy在二者间建立防火墙。本应该直接访问真实对象,但是代价太大,所以创建并访问代理对象(和真实对象有同样的接口)以降低代价。需要真实对象时再通过委托访问真实对象。
②代理模式的例子

在这里插入图片描述

③适配器模式和代理模式的区别
适配器模式的目的是消除不兼容,以客户端期望的统一的方式建立联系。接口不同。
代理模式的目的是隔离对复杂对象的访问,降低代价。接口相同。

行为模式

1.策略模式Strategy
①某个接口(通用)有多个实现,使用委托,根据不同实际情况进行调用切换。
2.模板模式Template method
①使用继承和重写实现。一个类作为模板,用子类进行继承和扩充。共性的步骤在抽象类内公共实现,差异化的步骤在各个子类中实现。
3.迭代器Iterator
①用迭代器对集合进行操作。客户端希望遍历被放入容器/集合类的一组ADT对象,无需关心容器的具体类型。即是不管对象被放进哪里,都提供同样的遍历方式。
②迭代器是可变类。使用时集合中的当前对象有两个引用,一个来自集合,另一个来自迭代器。所以不使用迭代器遍历时不能删除元素,即只能使用迭代器的remove进行删除。
4.观察者(Observer)模式
①类似于广播的一对多模式。Sbuject维护一个Observer的集合,应该具有Attach、Detach(添加和删除Observer)的操作,和Notify(改变Observer,Subject调用Observer的功能)的操作。
②观察者模式的例子
其中Observer的Subject属性可以去掉,代表可以观测任意“偶像”
在这里插入图片描述
在这里插入图片描述

③Java提供Observable接口和Observer接口。
5.访问者(Visitor)模式
①本质上将数据和作用于数据上的某些特定操作分离开来。
②为ADT预留一个将来可扩展功能的“接入点”(Element的accept方法),外部实现的功能代码可以在不改变ADT本身的情况下通过委托接入ADT。
③分为Visitor类和Element类。针对不同子类型的element,分别实现visit操作。Element类的accept(Visitor)与特定的Visitor子类联系起来,允许其对自己的数据操作。

④存在双向委托,即Visitor和Element接口相互调用。
⑤例子
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

⑥Visitor模式在特定ADT上执行特定操作,但是该操作不在ADT内部实现,而实委托到独立的Visitor对象。客户端可以灵活地扩展/改变Visitor的操作而不影响ADT。
⑦策略模式和访问者模式的区别
二者都是通过委托建立两个对象的动态联系。但是Visitor强调的是外部定义某种对ADT的操作,该操作和ADT自身关系不大,只是访问ADT,故ADT内部只需要开放accept(Visitor)即可,客户端在外部调用。策略模式强调对ADT内部某些功能相应算法的灵活替换,这些算法是ADT功能的重要组成部分,只不过是委托到外部而已。
Visitor是站在外部客户端角度,灵活增加对ADT的不同操作;Strategy站在内部ADT的角度,灵活变化对其内部功能的不同配置。

创建模式

1.工厂模式(虚拟构造器)
①当客户端不知道要创建哪个具体类的实现,或者不想在客户端代码中指明要具体创建的实例时,使用工厂方法。定义一个用于创建对象的接口,让其子类觉得实例化哪一个类,从而使一个类的实例化延迟到其子类。
②该模式中,每一个工厂只创建某一种类型的产品。
③工厂方法举例:
常规情况下 Product p = new ProductTwo();
工厂模式下 Product p = new ConcreteTwo.makeObject();
④将工厂类的方法设置成static,则不需要创建工厂类实例也能创建产品。
2.抽象工厂模式
①提供接口以创建一组互相依赖的对象,但不需要指明其具体类。抽象工厂负责创建每个组成部分,遵循各组成部分之间的固定搭配。例如窗口分为1类型和2类型,滚动条分为1类型和2类型。提供两个工厂类,一个创建窗口1和滚动条1,另一个创建窗口2和滚动条2。抽象工厂方法可以同时创建窗口和滚动条,并且实现它们的固定组合(类似于套餐)。
②该模式中,每一个工厂创建多种类型的产品。

③本质上是把多类的工厂方法组合在一起,特点是遵循固定搭配规则。

可维护性的度量与构造原则

1.软件维护的种类:纠错性、适应性、完善性、预防性
2.提高可维护性的方法:
从原则上通过模块化。
OO设计原则(SOLID、GRASP)
OO设计模式
基于状态的构造技术
基于语法的构造技术(正则表达式)

模块化设计

1.模块化设计的原则:直接映射、尽可能少的接口、尽可能小的接口、显式接口、信息隐藏
2.耦合和内聚

3.OO设计原则-SOLID
①单一责任原则
不应该有多于一个的原因让ADT发生变化,否则就应该拆分开。责任就是变化的原因,即一个类承担一个责任。
②开放-封闭原则
对扩展性的开发,对修改的封闭。模块的行为是可扩展的,从而该模块可表现出新的行为以满足需求的变化。但是模块自身的代码是不应被修改的,扩展模块行为的一般途径是修改模块的内部实现,如果一个模块不能被修改,那么它通常被认为是具有固定的行为。
针对多个实现抽象出一个具体的接口,如果有新的实现,继承该接口即可。从而支持了对扩展的开放。

在这里插入图片描述

③Liskov替换原则***
子类型必须能够替换其父类型,派生类必须能够通过其基类的接口使用,客户端无需了解二者之间的差异。
④依赖转置原则
尽量依赖接口,而不是接口的具体实现类。抽象的模块不应该依赖于具体的模块,具体应该依赖于抽象。

⑤接口分离原则
只提供客户端必需的接口。

在这里插入图片描述

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

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

相关文章

回顾 | 使用Visual Studio Code进行端到端应用程序开发

点击蓝字关注我们,获得更多课程吧~微软Reactor 为帮助广开发者,技术爱好者,更好的学习 Python,数据科学,机器学习,AI,区块链等技术,将每周三到周六,组织 3~5 场线上分享活…

软件构造学习笔记-第十一周

本周的内容是,比较各个设计模式的区别和联系,并介绍了状态模式和备忘录模式,以及正则表达式。正则表达式用于对文本文件的处理。在实验3中有一项要求是对输入文本进行解析,构造航班。要求表达式不仅要读入合法数据,还要…

实现 OutOfMemory​

通过代码实现 OutOfMemoryIntro来尝试写一个发生 OutOfMemoryException 的代码吧,开启煞笔代码第三篇 —— OutofMemoryOutOfMemoryOutOfMemory 顾名思义就是内存不足,在 .NET 中当内存不足的时候就会抛出 OutOfMemoryException 的异常。想要触发 OutOfM…

软件构造学习笔记-实验3

本次实验要求从五项要求(航班管理、高铁车次管理、操作系统进程管理、大学课表管理、学习日程管理)里完成三项要求,并且尽量实现复用。 面向可复用性和可维护性的设计:PlanningEntry 1.首先设计一个类CommonPlanningEntry来实现…

用 Span 对 C# 进程中三大内存区域进行统一访问 ,太厉害了!

一:背景 1. 讲故事前段时间写了几篇 C# 漫文,评论留言中有很多朋友多次提到 Span,周末抽空看了下,确实是一个非常????????的新结构,让我想到了当年的WCF,它统一了.NET下各种零散的分布式技术&#…

福利 | 全网疯传免费领,一整套算法课程,拿走不谢!

算法对于程序员而言,到底有多重要,这已经是一个老生常谈的话题了。我看过很多有潜力且非常努力的程序员,在进阶高级工程师或架构师的路上,栽在了“算法”上,说实话,我并不意外。如果说得功利和实际一些&…

软件构造学习笔记-第十二周

本周介绍了异常以及异常的处理。Java的异常机制将处理异常的代码整合到一个代码块中,而不是通过if-else进行处理,提高了代码整体的简洁性。同时,异常机制可以更加详细地说明错误类型、引起错误的位置、错误信息,对程序健壮性十分有…

C#中LINQ与数据管道

假如有一个集合,里面有数字1-10,现在想实现从这10个数字中取出偶数数字,然后将得到的偶数乘以10,最后输出前三个。代码如下:代码非常的简单,最后会得到20、40、60这三个数字,但结果并不是我们今…

软件构造学习笔记-实验4

磕磕绊绊也算是完成了最后一个实验。记录一下实验中遇到的问题。 IDEA中SpotBugs的安装和使用 从网上找教程,都说IDEA没有使用版权。结果我直接在插件中就找到了。点击安装并重启即可。 使用时,选择需要操作的项目/包/类点击右键,就能看到S…

使用ML.NET模型生成器来完成图片性别识别

什么是ML.NET?ML.NET 使你能够在联机或脱机场景中将机器学习添加到 .NET 应用程序中。借助此功能,可以使用应用程序的可用数据进行自动预测。机器学习应用程序利用数据中的模式来进行预测,而不需要进行显式编程。ML.NET 的核心是机器学习模型…

软件构造学习笔记-第十四周、十五周

课程进入了尾声。本周内容主要是线程安全相关。线程错误比一般的错误更加难以发现和修改,甚至加入一条print语句就能改变时间分片,从而导致错误消失。重点介绍了“锁”的机制,在使用时避免对整个方法进行lock,而是对可能发生线程不…

打爆你的 CPU

通过一段代码打爆你的 CPUIntro这是这个煞笔代码系列的最后一篇——Full CPU,相对来说也比前面三个简单一些,没有那么多的知识点。今天来尝试写一段代码,把 CPU 打满,让所有处理器的 CPU 使用率达到 100%,Lets do it.如…

吴恩达DeepLearningCourse1-神经网络和深度学习

计划在9月4日(截止日期)之前完成DeepLearning的所有课程学习。每个课程对应一篇博客,根据学习进度随时更新。 参考课程文章目录(一)深度学习概论结构化数据和非结构化数据提高效果的方法(二)神经…

吴恩达DeepLearningCourse2-改善深层神经网络:超参数调试、正则化以及优化

文章目录第一周:深度学习的实用层面训练、开发、测试集偏差、方差机器学习基本步骤L2正则化Dropout(随机失活)正则化其它正则化方法正则化输入神经网络的权重初始化梯度检验第二周:优化算法Mini-Batch梯度下降法指数加权平均指数加…

面向监狱编程:一伙人植入木马程序至 559 万部手机,盈利 33 万!

2018 年下半年以来,孙某(上海宏路数据技术股份有限公司副总经理)与苏某(北京亿量科技有限公司法定代表人)商议合作开展锁屏拉起广告业务(通过在用户手机上植入带有木马程序的 SDK,可控制手机在锁…

吴恩达DeepLearningCourse3-结构化机器学习项目

文章目录第一周:机器学习策略1正交化单一数字评估指标满足和优化指标训练/开发/测试集机器学习和人的表现第二周:机器学习策略2进行误差分析修正标注错误的数据使用来自不同分布的数据进行训练和测试数据分布不匹配时的偏差与方差的分析处理数据分布不匹…

程序员过关斩将--搞定秒杀,只需要这几步!!

“灵魂拷问秒杀这种大并发的写场景,直接分库分表开干?应对秒杀活动的流量高峰很难吗?不要拿淘宝级别的秒杀忽悠我秒杀活动特点我敢说凡是做过电商的同学,都会遇到运营展开的秒杀,限时购等“高并发”的活动。市面上也有…

吴恩达DeepLearningCourse4-卷积神经网络

部分内容参考之前的笔记 PyTorch深度学习实践 文章目录第一周:卷积神经网络边缘检测Padding、Stride三维卷积卷积神经网络中的一层池化层第二周:深度卷积网络实例探究残差网络1x1卷积Inception模块和网络卷积神经网络的迁移学习第三周:目标检…

那些鼓吹国内首个.NET 5框架的,该醒醒了!

前两天看过园子里有篇【国内首个 .NET 5 框架 XX 斩获 XXX stars,XXX 发布】,一顿羡慕嫉妒恨啊。我这.net core 3.1才上手没几天,还没用热乎呢,你这.NET 5的框架都出来了。我好难啊!不过难归难咱也得跟上啊。于是一个天高云淡的的…

吴恩达DeepLearningCourse5-序列模型

终于在八月末学完了这门课程,这个月虽然为此不停地忙碌,但每天都在进步也是一种乐趣。 吴恩达教授的课程循序渐进,适合初学者,非常感谢他的辛苦付出。 文章目录第一周:循环序列模型循环神经网络(RNN&#…