听说最近咱们方向的小可爱要考试了,作为一个老学姐(强调!)(指指点点),给大家分享一下我对考试的一些心得吧~
**提前声明:我的成绩也不是特别好,心得也不一定有啥帮助,如果浪费了你们的时间不要骂我哈:)
设计模式:
首先,下面的内容都是精华,一定要全背会!其次,选择题需要把下面内容融会贯通然后再加点小拓展,才能做出高分,但是简答题背会下面的东西就无敌。大题要对所有设计模式有不错的理解,还要熟记代码才能拿满分。建议找去年的题做做,感受一下。
单一职责原则:提高复用性,高内聚低耦合。
开闭原则:对开放拓展,对修改关闭。灵活性,稳定性,抽象化。
里氏代换原则:父类可替换为子类,反之不成立。(抽象化,代码复用,扩展性)
依赖倒转原则:针对抽象层编程。(抽象化)
接口隔离原则:多个专门的接口取代统一接口,不依赖不需要的接口。
合成复用原则:多组合聚合,少继承。(降耦合)
迪米特法则:一个软件实体尽可能少地与其他实体相互作用。只与直接朋友通信。(松耦合)
名称 | 定义 | 优点 | 缺点 | 适用环境 | 备注 |
---|---|---|---|---|---|
简单工厂 (静态工厂) (创建型) | 根据参数的不同返回不同类的实例。 OA系统 | 对象的创建、使用分离。 使用配置文件,提高了系统灵活性。 客户端只需要知道产品类对应参数。 | 工厂类职责过重。 扩展困难。 增加了系统复杂性和理解难度。 | 工厂类负责创建的对象少。 不关心创建细节。 | 单一职责原则 降耦合 开闭原则 |
工厂方法 | 将类的实例化延迟到子类中完成,由子类决定实例化(创建)哪个类。 日志记录器 | 向客户隐藏哪种具体产品类被实例化。 工厂自主确定创建何种产品对象。 加入新产品符合开闭原则。 | 类的个数成对增加,系统复杂度提升。 增加了系统的抽象性和理解难度。 | 客户不知道具体产品类的类名。 抽象工厂类通过其子类指定创建哪个对象。 | 开闭原则 可扩展性 |
抽象工厂 | 提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。 电器工厂,数据库操作工厂 | 隔离了具体类的生成。 保证客户端始终只使用同一产品族对象。 增加新的产品族方便,符合开闭原则。 | 增加新的产品等级结构麻烦,违背开闭原则。 | 系统不依赖产品创建、组合、表达细节。 每次只使用一个产品族且所有产品一起使用。 产品等级结构稳定。 | +新产品族,符合开闭。 +新产品等级结构,不符合开闭。 |
建造者 Builder | 将复杂对象的构建与表示分离,使同样的构建可以创建不同表示。 KFC套餐,JavaMail | 产品本身与产品创建过程解耦。 替换/新增具体建造者符合开闭原则。 可更精细地控制产品创建过程。 | 产品之间差异大则不适用。 产品内部变化复杂需更多具体建造类,导致系统过于庞大。 | 需要生成的产品有复杂的内部结构,属性相互依赖。 对象创建过程独立于创建对象的类。 | |
原型模式 Prototype | 给出一个原型对象指明所要创建的对象类型,复制这个原型对象创建更多同类型对象。 浅克隆,深克隆(序列化),邮件复制。 | 简化对象创建过程,提高新实例创建效率。 简化创建结构,扩展性好。 深克隆方式能保存对象状态。(撤销) | 每个类需要配备一个克隆方法。 改造已有类需修改源码,改变开闭原则。 深克隆代码复杂。 | 创建新对象成本较大。 对象的状态变化小。 避免使用分层次工厂类。 | |
单例模式 Singleton | 确保一个类中只有一个实例,自行实例化并向整个系统提供这个实例。 身份证,打印池 | 提供了对唯一实例的受控访问。 节约系统资源,提高性能。 允许多例类。 | 扩展困难。 单例类职责过重。 垃圾自动回收机制丢失单例对象的状态。 | 只需要/允许创建一个对象。 只允许使用一个公共访问点。 | |
适配器模式 (结构型) Adaptee | 将一个接口转换成客户希望的另一个接口,使接口不兼容的类可以一起工作。 机器人模仿,加密适配器 | 将目标类和适配器解耦。 增加了类的透明性和复用性。 灵活性和扩展性好。 | 类适配器:一次只适配一个适配者类。 目标抽象类只能为接口,不能为类。 对象适配器:置换适配者类的某些方法麻烦。 | 系统需要使用一些现有的类,而这些类的接口不符合系统需要。 创建一个可以重复使用的类。 | |
桥接模式 Implementor | 抽象与实现部分分离,使他们可以独立地变化。 大中小彩色毛笔,跨平台视频播放器 | 分离抽象接口及其实现部分。 取代多层继承,减少子类个数。 提高系统的可扩展性。 | 增加系统的理解与设计难度。 难以正确识别系统中两个独立变化的维度。 | 增加抽象化和具体化间的灵活性。 抽象、实现部分独立扩展互不影响。 不希望使用继承。 | |
组合模式 Leaf | 组合多个对象形成树形结构以表示整体-部分的结构层次,对单个对象和组合对象的使用具有一致性。 水果盘,文件浏览 | 定义分层次复杂对象,忽略层次差异。 增加新容量构件和叶子构件方便。 实现树形结构面向对象。 | 抽象复杂,难度大。 增加新构件时很难对容器中的构件类型进行限制。 | 希望客户一致对待整体,部分层次结构。 面向对象开发系统中处理树形结构。 系统中可分离出叶子和容器对象。 | |
装饰模式 Decorator | 动态地给一个对象增加一些额外职责。 变形金刚变飞机、机器人,多重加密系统 | 比继承灵活,不会急剧增加类的个数。 动态方式扩展对象功能。 可对一个对象多次装饰。 加新的构件类和装饰类符合开闭原则。 | 一定程度下影响对象性能。 比继承更易出错,难排错。 | 动态透明地给单个对象添加职责。 不能采用继承方式扩展系统。 | |
外观模式 Facade | 为复杂子系统提供一个统一入口。 电源总开关,文件加密外观类, | 减少了客户端所需处理的对象数目。 实现了子系统与客户端间的松耦合。 子系统修改对其他子系统,外观无影响。 | 不能很好地限制客户端直接使用子系统类。 增加新子系统需修改外观类,违背开闭原则。 | 为复杂子系统提供简单入口。 客户端与多个子系统存在依赖性。 层次性结构通过外观类建立联系。 | 迪米特法则 降耦合 |
代理模式 Proxy | 给对象提供一个代理,并由代理对象控制原对象的引用。 论坛权限控制,图片预览 | 协调调用者、被调用者,降耦合。 增加/更换代理类无须修改代码,符合开闭原则。 | (保护代理)可能造成请求处理缓慢。 (远程代理)实现过程复杂。 | 远程代理,虚拟代理(预览),缓冲代理(共享访问),保护代理(权限),智能引用代理 | |
命令模式(对象型行为模式) Invoker | 将一个请求封装为一个对象,使请求调用者和接收者解耦。 电视遥控器(开关,exchange),功能键 | 降低系统耦合度。 新命令易加入系统,符合开闭原则。 命令队列,宏命令,请求撤销,恢复。 | 可能会导致某些系统有过多具体命令类。 | 将请求调用者和接收者解耦。 不同时间指定请求,请求排队,执行命令撤销,恢复。 | |
迭代器模式 Iterator | 提供一种方法访问聚合对象,而不暴露对象的内部表示。 遥控器换台 | 同一聚合对象可定义多种遍历方式。 简化了聚合类。 增加聚合类、迭代器方便,符合开闭原则。 | 增加新聚合类需要新迭代器类,复杂性提升。 设计难度大,很难全面考虑。 | 访问聚合对象内容而不暴露内部。 为一个聚合类提供多种遍历方式。 为遍历不同聚合结构提供统一接口。 | 单一职责原则 |
观察者模式 Observer | 定义了对象间的一种一对多依赖关系,使每当一个对象状态改变时,其依赖对象得到通知并被自动更新。 猫狗鼠,MVC,自定义登录控件 | 可实现表示层与数据逻辑层分离。 支持广播通信,一对多。 在观察目标和观察者间建立了一个抽象耦合。 增加具体观察者和观察目标符合开闭原则。 | 通知所有观察者会花费很多时间。 如有循环依赖可能使系统崩溃。 观察者不知道目标对象是怎么发生变化的。 | 抽象模型一方面依赖于另一方面。 一个对象改变会导致别的对象改变。 需要在系统中创建一个触发链。 | |
状态模式 State | 允许一个对象在其内部改变时改变它的行为。 论坛用户等级,人开心时笑伤心时哭,银行账户余额为正则绿、欠款则红 | 封装状态转换规则,集中管理代码。 注入不同状态可使环境对象行为不同。 允许状态转换逻辑与状态对象合成一体。 多环境对象共享一个状态对象,可以减少类的个数。 | 增加类和对象的个数,增大开销。 使用不当代码会导致混乱,增加难度。 新增/修改状态类不符合开闭原则。 | 状态改变导致对象行为变化。 代码有大量与对象状态有关的条件语句。 | |
策略模式 Strategy | 定义一系列算法,并将每个算法封装在一个类中,并让他们可以互相替换。让算法独立于使用它的客户而变化。 旅游出行策略,排序策略 | 支持开闭原则,可管理相关算法族。 可替换继承,提高算法复用。 避免多重条件语句。 | 客户端必须知道所有策略类并进行选择。 可能造成系统产生很多具体策略类。 无法同时使用多个策略类。 | 一个系统需动态地在多种算法中选择一个。 避免使用难以维护的多重条件选择。 不希望客户知道与算法相关的数据结构。 | 算法保密性 安全性 |
编译原理
我是通过哔哩哔哩大学的一个编译原理混子速成课学完的,有笔记(文章最后有百度网盘的分享,自取)
跟老师讲的做题步骤不一样,至于能不能得分我也不大清楚,慎学。
链接:https://www.bilibili.com/video/BV1ft4y1X7p6/
注:往年题全部做五遍,包过包高分
SpringBoot
如果学院里某个g姓老师在带课的话,一定要去蹭!讲的特别特别好,理论实践相结合,而且最重要的是会奶!
大题把springboot的数据传输过程搞明白,实验二搞明白!就好了。下附代码。
Article实体类:
public class Article {
private int id;
private String title;
private String content;
private List<Comment> commentList;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public List<Comment> getCommentList() {
return commentList;
}
public void setCommentList(List<Comment> commentList) {
this.commentList = commentList;
}
@Override
public String toString() {
return "Article{" +
"id=" + id +
", title='" + title + '\'' +
", content='" + content + '\'' +
", commentList=" + commentList +
'}';
}
}
Comment实体类:
public class Comment {
private int id;
private String content;
private String author;
private int aId;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getaId() {
return aId;
}
public void setaId(int aId) {
this.aId = aId;
}
@Override
public String toString() {
return "Comment{" +
"id=" + id +
", content='" + content + '\'' +
", author='" + author + '\'' +
", aId=" + aId +
'}';
}
}
mapper:
@Repository @Mapper
public interface ArticleMapper {
public Article findById(int id);
public List<Article> findAll();
}
mapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--<mapper>及<mapper>中内容自行补充-->
<mapper namespace="springbootsy.sy2.mapper.ArticleMapper">
<select id="findById" parameterType="Integer" resultMap="articleWithComment">
select a.*,b.id as cid ,b.content as bcontent ,author,a_id
from t_article a left join t_comment b
on a.id=a_id
where a_id=#{
id}
</select>
<resultMap id="articleWithComment" type="Article">
<id property="id" column="id"/>
<result property="title" column="title"/>
<result property="content" column="content"/>
<collection property="commentList" ofType="Comment">
<id property="id" column="cid"/>
<result property="content" column="bcontent"/>
<result property="author" column="author"/>
<result property="aId" column="a_id"/>
</collection>
</resultMap>
<select id="findAll" parameterType="Integer" resultMap="articleWithComment">
select a.*,b.id as cid ,b.content as bcontent ,author,a_id
from t_article a left join t_comment b
on a.id=a_id
</select>
</mapper>
Controller:
@RestController
public class Controller {
@GetMapping("/hello")
public String hello(){
return "软件1904班 白旭君 2019005368";
}
}
ArticleController:
@Controller
@RequestMapping("/article")
public class ArticleController {
@Autowired
private ArticleMapper articleMapper;
@GetMapping("/findAll")
public String findAll(Model model){
List<Article> articleList = articleMapper.findAll();
model.addAttribute("articleLists",articleList);
return "articleList";
}
@GetMapping("/findById")
public String findById(int id,Model model){
Article article = articleMapper.findById(id);
model.addAttribute("article",article);
return "articleDetail";
}
}
差不多就这些了,很多同学问我要实验报告,文章最后用百度网盘进行了分享。内容包含了一些我的个人信息,希望同学们不要恶意使用哦~
IT项目管理
就把PPT和老师发的那个文档背熟就行,平常多练练口才,考试写满!
文件(带一点点笔记)可以百度网盘自取。
百度网盘文件分享:
链接:https://pan.baidu.com/s/1jOXvkSle2-DVsoSfYGWZJA?pwd=giv2
提取码:giv2
–来自百度网盘超级会员V5的分享
(看到没有,尊贵的v5)
声明:分享的内容均为免费,旨在为一些需要的同学提供一点点帮助,请勿私自售卖。
如果有啥想咨询的啥的,直接加我就好了,我有空就会回的~最后祝愿大家学业有成,事业顺利!一路长虹!
有想入门前端的,或者学Java、学安卓的,找我,我有很多百度网盘的网课可以分享!(都是免费的,不要再问我多少钱啦)
QQ1226371240,微信b1958721504,记得备注。