哈工大软件构造-设计模式学习心得
设计模式
设计模式,即Design Patterns,是指在软件设计中,被反复使用的一种代码设计经验。 使用设计模式的目的是为了可重用代码,提高代码的可扩展性和可维护性
一:总纲
按照王老师的体系,23种设计模式,看上去很多,但万变不离其宗.一切设计模式,均是离不开这两张图.
具体来说,就如下两种:
1. 只有继承关系的:
DIP:依赖倒转原则,细节应当依赖于抽象,抽象不应当依赖于细节。
OCP:开闭原则,软件实体应当对扩展开放,对修改关闭.
特点:
只有一颗继承树
在设计模式里面的体现:
模板方法:比如,我写了一个白盒框架,现在要往里面加东西,我希望用户来进行手动添加,那么,我给用户一个接口,下面的子类型实现是可以进行任意安排的.
2. 继承+委托(delegation)
特点:两颗继承树
通过另一组继承树,对内在的实现进行了隐藏,具体的体现比如说:Factory方法,Adapter方法,装饰器模式,等等.
对于装饰器来说,可以认为这两颗树均是自己,通过自己对自己进行委托,进行功能的附加.
下面,我们来具体的对王老师上课所授的7种设计模式展开具体分析:
二:具体的7种设计模式
2.1 工厂方法:
用户是通过工厂类来得到新的对象,而不是通过new运算符来得到新的对象
常规情况
Product A=new ProductA();工厂方法
Product B=ProductFactory.ProduceA();
正如船舶里面的水隔舱,工厂类对对象的创建与用户进行了隔离.对于用户而言,它是不知道它的要的产品具体叫什么,这个提供产品的事情,已经被工厂所取代.如果我们需要对功能进行修改的话,只需要动工厂的new的对象,客户端的程序实质上,是稳定的.
2.2 适配器模式
考虑下列情形:
假如我们在进行一个机器学习的项目,我们的核心算法,它需要提供一个numpy形式的矩阵,而我们的数据采集器,返回的矩阵,是一个excel文件.
这个时候,我们就需要一个适配器,帮我们干活了
它通过委托与接口,在二者之间建立了如下的桥梁;
2.3 装饰器模式
人靠衣装,在街上走,你会看到有穿T恤的,穿长袖夹克的,有穿背心的各种各样的人.
那么,如果要建立这样的关系的话,我们是可以通过继承来组合,也可以通过建立装饰器来进行委托.
如果是组合的话,问题会越来越麻烦.
设想,假如一开始所有人都穿T恤,那么到后来,秋天了,大家穿长袖的,有可能是里面套了一个背心,也有可能是里面传了一件毛衣,那么我们都用继承来进行处理的话,这个组合树,将会越来越大.问题很大!
这就是组合爆炸
所以,正确的做法是,让类学会穿衣服.不同的衣服,展现出不同的特性.有不同的功能
为每一个特性构造子类,并通过委派机制,添加到对象上.
基类实现最原始的功能,然后每一个装饰类实现一部分,逐层的去委派实现.
2.4策略模式
考虑如下的场景:
假如我们在写一个文本翻译的APP,用户输入文本,我们对其进行翻译.
我们一开始是采用SVD分解对文本进行词嵌入.后来,竞争对手纷纷采用了BERT来进行词嵌入,效果比我们好很多.那么,我们也想要用BERT来进行,不过由于考虑到以后的扩展,我们决定将词嵌入,放到一个方法类里面去进行.
即这里的策略类.
策略模式:
存在多种算法来处理同一个任务,但client需要根据需要动态切换算法.
我们可以为不同的实现算法构造抽象接口.利用委托,在运行时,动态传入Client倾向的算法类的实例.
其UML图如下;
2.5 模板模式
还是我们的文本翻译APP.
众所周知,NLP文本翻译任务,包含以下几个基本步骤:
文本预处理->文本词嵌入->Seq2Seq的生成
我们可以把这几个步骤抽出来作为模板,子类在继承时,进行实现.
让子类分别实现我们的模板里面的方法,预处理,词嵌入,文本生成.
他们,作事情的步骤时一样的,但具体的方法不同.让共性的步骤在公共实现.差异化的在子类实现.
2.6 迭代器模式
用途:我们给外界用户的往往是一个黑箱,如果用户有想要逛逛的需求的话,我们便要在既维护内在表示的基础上,又满足外界用户的需求.
在Java里面已经提供了下面的接口:
Iterable接口:实现这个的集合对象是可遍历的
Iterator接口:迭代器,实现这个的是可以进行显示/隐式的进行迭代的.
2.7 Visitor模式
简单点说:就是预留扩展点,以便日后的扩展
为我们的对象的特定Visit,运行时进行动态的绑定.操作可以灵活更改的.方便以后操作.
以上就是对于设计模式的一些总结与思考,谢谢.
哈工大软件构造-设计模式学习心得相关推荐
- 【哈工大软件构造】学习笔记10 第十章、第十一章、第十二章
目录 第十章 面向可维护性的构造技术 1 软件维护和演化 2 可维护性的度量 3 模块化设计和模块性准则 模块划分的五个准则 模块设计的五个原则 耦合度和聚合度 4 OO设计准则:SOLID SRP ...
- 哈工大软件构造lab2---实验心得
实验目标概述 本次实验训练抽象数据类型(ADT)的设计.规约.测试,并使用面向对象编程(OOP)技术实现ADT.具体来说: l针对给定的应用问题,从问题描述中识别所需的ADT: l设计ADT规约(pr ...
- 哈工大2021软件构造实验3心得(1)-进行GUI设计
哈工大2021软件构造实验3心得(1)-进行GUI设计 最近,笔者完成下窝工的软构实验三.在完成过程中,有很多坑想要记录一下. 顺便方便一下后来的窝工学子. 此Blog主要讨论如何在Eclipse里面 ...
- 哈工大软件构造期末知识点总结
哈工大软件构造试题构成: 1.30-45分的选择题,10-20题 2.55-70分的简答与设计题,5-6题 考试知识点(不全面): 1.git工具的知识点 2.Java设计模式(一共有23个,主要考察 ...
- 2022哈工大软件构造lab1小结(知识点)
哈工大软件构造lab1小结 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 问题一 使用的库 异常处理机制 字符串内容检查 写入文件 问题二 problem 3:画一 ...
- 哈工大软件构造 复习
哈工大软件构造试题构成: 1.30分的选择题 2.70分的简答题 2019考试知识点(重要的,但不涵盖全部考试范围): 1.git工具的知识点(没有考察命令行,考察的主要是git的演变及各部分的作用) ...
- 哈工大软件构造课程知识点总结(一)
系列文章目录 哈工大软件构造课程知识点总结(一) 哈工大软件构造课程知识点总结(二) 哈工大软件构造课程知识点总结(三) 哈工大软件构造课程知识点总结(四) 哈工大软件构造课程知识点总结(五) 哈工大 ...
- 哈工大软件构造课程知识点总结(二)
系列文章目录 哈工大软件构造课程知识点总结(一) 哈工大软件构造课程知识点总结(二) 哈工大软件构造课程知识点总结(三) 哈工大软件构造课程知识点总结(四) 哈工大软件构造课程知识点总结(五) 哈工大 ...
- 哈工大软件构造课程知识点总结(三)
系列文章目录 哈工大软件构造课程知识点总结(一) 哈工大软件构造课程知识点总结(二) 哈工大软件构造课程知识点总结(三) 哈工大软件构造课程知识点总结(四) 哈工大软件构造课程知识点总结(五) 哈工大 ...
最新文章
- asp.net程序性能优化的七个方面
- Swift41/90Days - 面向轨道编程 - Swift 中的异常处理
- 贝佐斯旗下媒体爆料:亚马逊因言废人,不管啥岗位,抗议就走人
- uwsgi模式_nginx+uwsgi 和nginx+gunicorn区别、如何部署
- python读取大文件-使用Python读取大文件的方法
- html中怎么自动获得搜索文本框的光标焦点
- intellij idea jdk language level
- Elasticsearch Restful API
- 数组实现c语言学生成绩管理系统
- java查重精确算法_一个查重算法的多种实现思路
- 一副眼镜一千多贵吗_央视曝光!一副眼镜上千元,出厂价却只要几十元
- Halium 9 尝鲜 -- 在小米平板4上的移植 (六)
- 图片服务器FastDFS的安装及使用
- 【BZOJ3837】[Pa2013]Filary 随机化神题
- ios上查看html源码,如何在ios手机端的Safari浏览器中“查看网页源代码”
- 为什么酒店公共办公楼采用指纹|RFID卡|密码门锁作为门禁使用及选型注意事项
- 有符号拓展:signed-extending无符号拓展:unsigned-extending
- Element-ui和vue-element-admin学习
- 万网服务器如何备份网站数据库,万网主机如何备份数据
- onethink迁移服务器后,验证码验证不通过的问题