우리 방향의 귀염둥이가 최근에 시험을 본다고 들었어. 선배로서 ( 강조!) (가리키며) 시험에 대한 경험을 말씀 드리겠습니다 ~
** 사전공지 : 제 성적이 특별히 좋지 않고 제 경험이 도움이 되지 않을 수도 있으니 시간낭비 하시면 혼내지 말아주세요 :)
디자인 패턴:
우선 다음 내용은 요령이니 다 외우셔야 합니다! 둘째, 객관식 문제는 다음 내용을 통합한 다음 약간의 확장을 추가하여 고득점을 만들어야 하지만 단답형 문제는 다음 사항을 외우면 무적입니다. 큰 질문의 경우 모든 디자인 패턴을 잘 이해하고 있어야 하며 코드를 암기해야 만점을 받을 수 있습니다. 작년의 질문들을 찾아보고 느껴보는 것을 추천합니다.
단일 책임 원칙: 재사용성, 높은 응집력 및 낮은 결합도를 개선합니다.
개폐의 원리: 확장에는 개방, 변형에는 폐쇄. 유연성, 안정성, 추상화.
Liskov 대체 원칙: 상위 클래스는 하위 클래스로 대체될 수 있지만 그 반대는 불가능합니다. (추상화, 코드 재사용, 확장성)
종속 역전 원칙: 추상화 계층을 위한 프로그래밍. (추상)
인터페이스 분리 원칙: 여러 특수 인터페이스가 통합 인터페이스를 대체하고 불필요한 인터페이스에 의존하지 않습니다.
합성 재사용의 원칙: 더 많은 조합과 집계, 더 적은 상속. (다운 커플링)
Demeter의 법칙: 소프트웨어 엔터티는 다른 엔터티와 가능한 한 적게 상호 작용합니다. 직접적인 친구들과만 소통하세요. (느슨한 결합)
이름 | 정의 | 이점 | 결점 | 적용 가능한 환경 | 주목 |
---|---|---|---|---|---|
심플 팩토리(정적 팩토리)(크리에이티브 타입) | 매개변수에 따라 다른 클래스의 인스턴스를 반환합니다. OA 시스템 | 객체의 생성과 사용은 분리되어 있습니다. 구성 파일을 사용하면 시스템 유연성이 향상됩니다. 클라이언트는 제품 카테고리의 해당 매개변수만 알면 됩니다. | 팩토리 클래스에는 너무 많은 책임이 있습니다. 스케일링이 어렵습니다. 시스템 복잡성과 이해의 어려움 증가. | 팩토리 클래스는 더 적은 수의 객체를 생성해야 합니다. 생성 세부 사항에 신경 쓰지 마십시오. | 단일 책임 원칙 다운 커플링 개폐 원칙 |
공장 방법 | 클래스의 인스턴스화는 하위 클래스로 지연되고 하위 클래스는 어떤 클래스를 인스턴스화(생성)할지 결정합니다. 나무꾼 | 구체적인 제품 클래스가 인스턴스화되는 클라이언트로부터 숨깁니다. 팩토리는 생성할 제품 개체를 독립적으로 결정합니다. 신제품 추가는 개방 폐쇄 원칙을 따릅니다. | 클래스의 수가 쌍으로 증가하고 시스템의 복잡성이 증가합니다. 그것은 시스템의 추상화와 이해의 어려움을 증가시킵니다. | 고객은 특정 제품 클래스의 클래스 이름을 모릅니다. 추상 팩토리 클래스는 하위 클래스를 통해 생성할 객체를 지정합니다. | 개방형 폐쇄 원칙 확장성 |
추상 공장 | 구체적인 클래스를 지정하지 않고 일련의 관련되거나 상호 의존적인 개체를 만들기 위한 인터페이스를 제공합니다. 전기 공장, 데이터베이스 운영 공장 | 구체적인 클래스의 생성은 격리됩니다. 클라이언트는 항상 동일한 제품군 개체만 사용하도록 보장됩니다. 새로운 제품군을 추가하는 것이 편리하고 개폐 원칙을 준수합니다. | 새로운 제품 수준 구조를 추가하는 것은 번거롭고 개폐 원칙을 위반합니다. | 이 시스템은 제품 생성, 구성 및 표현 세부 사항에 의존하지 않습니다. 한 번에 하나의 제품군만 사용하고 모든 제품을 함께 사용하십시오. 제품 계층 구조가 안정적입니다. | + 새로운 제품군, 일치하는 개폐. + 새로운 제품 클래스 구조, 개폐를 준수하지 않습니다. |
빌더 빌더 | 동일한 구성이 다른 표현을 만들 수 있도록 복잡한 객체의 구성과 표현을 분리합니다. KFC 패키지, JavaMail | 제품 자체는 제품 생성 프로세스에서 분리됩니다. 콘크리트 빌더 교체/추가는 개방형 폐쇄 원칙을 따릅니다. 제품 생성 프로세스를 보다 세밀하게 제어할 수 있습니다. | 상품간 차이가 큰 경우 해당되지 않습니다. 제품의 복잡한 내부 변경으로 인해 보다 구체적인 구성 클래스가 필요하므로 시스템이 지나치게 커집니다. | 생성해야 하는 제품은 내부 구조가 복잡하고 속성이 서로 의존적입니다. 객체 생성 프로세스는 객체를 생성하는 클래스와 독립적입니다. | |
프로토타입 모드 프로토타입 | 생성할 객체 유형을 나타내는 프로토타입 객체가 주어지면 이 프로토타입 객체를 복사하여 동일한 유형의 객체를 더 만듭니다. 얕은 복제, 깊은 복제(직렬화), 메일 복사. | 개체 생성 프로세스를 단순화하고 새 인스턴스 생성의 효율성을 향상시킵니다. 구조 생성을 단순화하고 확장성이 좋습니다. 깊은 복제 방법은 개체 상태를 저장할 수 있습니다. (폐지) | 각 클래스는 복제 방법을 갖추어야 합니다. 기존 클래스를 수정하려면 소스 코드를 수정하고 열고 닫는 원리를 변경해야 합니다. 딥 클론 코드는 복잡합니다. | 새 개체를 만드는 데 비용이 많이 듭니다. 객체의 상태는 거의 변하지 않습니다. 계층적 팩토리 클래스를 사용하지 마십시오. | |
싱글톤 모드 싱글톤 | 클래스의 인스턴스가 하나만 있는지 확인하려면 자신을 인스턴스화하고 이 인스턴스를 전체 시스템에 제공하십시오. ID 카드, 인쇄 풀 | 고유한 인스턴스에 대한 제어된 액세스를 제공합니다. 시스템 리소스를 절약하고 성능을 향상시킵니다. 클래스의 여러 인스턴스가 허용됩니다. | 스케일링이 어렵습니다. Singleton 클래스에는 너무 많은 책임이 있습니다. 자동 가비지 수집 메커니즘은 싱글톤 개체의 상태를 잃습니다. | 하나의 객체만 생성이 필요/허용됩니다. 공용 액세스 지점은 하나만 허용됩니다. | |
어댑터 모드(구조적 유형) Adaptee | 한 인터페이스를 클라이언트가 원하는 다른 인터페이스로 변환하여 호환되지 않는 인터페이스가 있는 클래스가 함께 작동할 수 있도록 합니다. 로봇 사칭, 암호화 어댑터 | 어댑터에서 대상 클래스를 분리하십시오. 클래스 투명성 및 재사용성 향상. 좋은 유연성과 확장성. | 클래스 어댑터: 한 번에 하나의 어댑터 클래스만 조정됩니다. 대상 추상 클래스는 클래스가 아닌 인터페이스만 될 수 있습니다. 개체 어댑터: 어댑터 클래스의 일부 메서드를 교체하는 것은 번거로운 일입니다. | 시스템은 일부 기존 클래스를 사용해야 하며 이러한 클래스의 인터페이스는 시스템의 요구 사항을 충족하지 않습니다. 재사용할 수 있는 클래스를 만듭니다. | |
브리지 모드 구현자 | 추상화는 구현과 부분적으로 분리되어 독립적으로 변경될 수 있습니다. 대형, 중형 및 소형 컬러 브러시, 크로스 플랫폼 비디오 플레이어 | 추상 인터페이스와 구현 부분의 분리. 다단계 상속 대신 하위 클래스 수를 줄입니다. 시스템의 확장성을 향상시킵니다. | 시스템 이해 및 설계의 어려움을 높입니다. 시스템에서 독립적으로 변화하는 두 차원을 정확하게 식별하는 데 어려움이 있습니다. | 추상화와 구체화 간의 유연성을 높입니다. 일부 독립적인 확장의 추상화 및 실현은 서로 영향을 미치지 않습니다. 상속을 사용하고 싶지 않습니다. | |
조합 모드잎 | 여러 개체가 결합되어 트리 구조를 형성하여 전체 계층 구조를 나타내며 단일 개체와 복합 개체의 사용이 일관됩니다. 과일 접시, 파일 탐색 | 계층적 차이를 무시하고 계층적 복합 개체를 정의합니다. 새 용량 구성 요소와 리프 구성 요소를 추가하는 것이 편리합니다. 객체 지향 트리 구조를 실현합니다. | 추상화는 복잡하고 어렵습니다. 새 구성 요소를 추가할 때 컨테이너의 구성 요소 유형을 제한하기 어렵습니다. | 클라이언트는 전체, 부분 계층 구조를 일관되게 처리해야 합니다. 개체 지향 개발 시스템에서 트리 구조를 처리합니다. 리프 및 컨테이너 개체는 시스템에서 분리할 수 있습니다. | |
데코레이터 모드 데코레이터 | 개체에 일부 추가 책임을 동적으로 추가합니다. 트랜스포머는 비행기, 로봇 및 다중 암호화 시스템으로 변신합니다. | 상속보다 유연하며 클래스 수가 크게 증가하지 않습니다. 개체 기능을 동적으로 확장합니다. 개체는 여러 번 장식할 수 있습니다. 새로운 컴포넌트 클래스와 데코레이션 클래스를 추가하는 것은 열고 닫는 원칙을 준수합니다. | 개체 성능에 어느 정도 영향을 미칩니다. 상속보다 오류가 발생하기 쉽고 디버그하기 어렵습니다. | 동적이고 투명하게 개별 개체에 책임을 추가합니다. 상속을 통해 시스템을 확장할 수 없습니다. | |
외관 모드 파사드 | 복잡한 하위 시스템에 대한 통합 항목을 제공합니다. 주 전원 스위치, 파일 암호화 출현 클래스, | 클라이언트가 처리해야 하는 개체 수를 줄입니다. 하위 시스템과 클라이언트 간의 느슨한 결합이 실현됩니다. 하위 시스템 수정은 다른 하위 시스템, 외관에 영향을 미치지 않습니다. | 클라이언트가 서브시스템 클래스를 직접 사용하는 것은 잘 제한되지 않습니다. 새로운 서브 시스템을 추가하려면 모양 클래스를 수정해야 하며 이는 개폐 원칙을 위반합니다. | 복잡한 하위 시스템에 쉽게 액세스할 수 있습니다. 클라이언트는 여러 하위 시스템에 종속됩니다. 계층 구조는 파사드 클래스를 통해 연결됩니다. | 데메테르의 법칙 다운커플링 |
프록시 모드 프록시 | 개체에 프록시를 제공하면 프록시 개체가 원래 개체의 참조를 제어합니다. 포럼 권한 제어, 사진 미리보기 | 발신자, 수신자, 디커플링을 조정합니다. 프록시 클래스를 추가/교체하기 위해 코드를 수정할 필요가 없으며 개폐 원칙을 준수합니다. | (보호 프록시)로 인해 요청 처리 속도가 느려질 수 있습니다. (원격 에이전트) 구현 프로세스가 복잡합니다. | 원격 프록시, 가상 프록시(미리보기), 버퍼 프록시(공유 액세스), 보호 프록시(권한), 스마트 참조 프록시 | |
명령 모드(객체 동작 모드) 호출자 | 요청 호출자와 수신자를 분리하기 위해 요청을 객체로 캡슐화합니다. TV 리모콘(스위치, 교환기), 기능키 | 시스템 커플링을 줄입니다. 새로운 명령은 시스템에 추가하기 쉽고 개폐 원칙을 준수합니다. 명령 대기열, 매크로, 실행 취소 요청, 재실행. | 일부 시스템에 특정 명령 클래스가 너무 많을 수 있습니다. | 요청 호출자와 수신자를 분리합니다. 요청은 서로 다른 시간에 지정되고, 요청이 대기하고, 실행 명령이 취소되고, 다시 시작됩니다. | |
반복자 모드 반복자 | 개체의 내부 표현을 노출하지 않고 집계된 개체에 액세스하는 방법을 제공합니다. 채널을 변경하는 원격 제어 | 동일한 집계 개체에 대해 여러 순회 방법을 정의할 수 있습니다. 간소화된 집계 클래스. 집계 클래스와 반복자를 추가하는 것이 편리하고 개폐 원칙을 준수합니다. | 새 집계 클래스를 추가하려면 새 반복자 클래스가 필요하므로 복잡성이 증가합니다. 디자인이 어렵고 종합적으로 고려하기가 어렵습니다. | 내부를 노출하지 않고 집계 개체 콘텐츠에 액세스합니다. 집계 클래스에 여러 순회 방법을 제공합니다. 다양한 집계 구조를 순회하기 위한 통합 인터페이스를 제공합니다. | 단일 책임 원칙 |
관찰자 패턴 관찰자 | 개체 간의 일대다 종속 관계가 정의되어 개체 상태가 변경될 때마다 해당 종속 개체에 알림이 전송되고 자동으로 업데이트됩니다. 고양이, 개, 마우스, MVC, 커스텀 로그인 컨트롤 | 프레젠테이션 계층과 데이터 논리 계층의 분리를 실현할 수 있습니다. 브로드캐스트 통신, 일대다를 지원합니다. 관찰 대상과 관찰자 사이에 추상 결합이 설정됩니다. 특정 관찰자 및 관찰 대상을 추가하는 것은 개폐의 원칙을 따릅니다. | 모든 관찰자에게 알리는 데는 많은 시간이 걸립니다. 순환 종속성이 있는 경우 시스템이 충돌할 수 있습니다. 관찰자는 대상 개체가 어떻게 변경되는지 알지 못합니다. | 추상 모델은 한쪽에 다른 쪽을 의존합니다. 한 객체를 변경하면 다른 객체도 변경됩니다. 시스템에서 트리거 체인을 생성해야 합니다. | |
상태 모드 상태 | 개체의 내부가 변경될 때 개체의 동작을 변경할 수 있습니다. 포럼 사용자 수준 사람들은 기쁠 때 웃고 슬플 때 울고 은행 잔고는 보통 녹색, 연체는 빨간색 | 封装状态转换规则,集中管理代码。 注入不同状态可使环境对象行为不同。 允许状态转换逻辑与状态对象合成一体。 多环境对象共享一个状态对象,可以减少类的个数。 | 增加类和对象的个数,增大开销。 使用不当代码会导致混乱,增加难度。 新增/修改状态类不符合开闭原则。 | 状态改变导致对象行为变化。 代码有大量与对象状态有关的条件语句。 | |
策略模式 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,记得备注。