目录
2)常见的软件设计模式分类分为多少大类?其中面向对象设计模式是又分为多少类?分别是什么?
3)三层客户端-服务器端体系结构的主要优点,以及利用三层客户端-服务器端体系结构设计的一个简单的业务系统
1.UML类图基本画法,包括继承、实现、依赖、关联、聚合和组合的图例画法
2.阿里巴巴编程规范中的工程规约(图),了解各层内容(重点)
5.消息中心服务应用场景,以及举出例子(前两项:异步解耦、削峰填谷)
名词解释
软件设计模式:
是对软件设计经验 的总结,是对软件设计中反复出现的设计问题的成功解决方案的描述。为了记录这些成功的设计经验并方便以后使用,软件设计模式通常包含4个基本要素:模式名称 、问题 、解决方案 以及效果 。它最重要的意义在于设计复用,在软件设计中出现问题直接复用成功案例不需要花费时间去重复设计。
开闭原则:
开闭原则有以下两个特征:
1)对于扩展是开放的,模块的行为是可以扩展的,当需求变化时,软件开发者可以对模块进行扩展,增加新功能。
2)对于修改是关闭的,在对模块进行扩展时,不允许改动模块中已存在的源代码。
创建型软件设计模式:
这是解决对象创建机制 的设计模式,该类设计模式尝试在具体的情况下以适当方式创建对象,主导思想为:封装 了系统使用的具体类的知识、隐藏了类的实例被创建和结合的细节。包括有简单工厂方法模式、工厂方法模式、抽象工厂模式、生成器模式和单例模式。
结构型软件设计模式:
该模式的主要目的是将不同的类和对象组合 在一起,形成更大或者更复杂的结构体,不是简单的类的堆砌,而是要提供这些类之间的关联方式。结构型软件设计模式包括组合模式、适配器模式、外观模式和桥接模式,这些模式都有其不同的应用场景,但相同之处都涉及对象之间的连接方式。
单例模式:
属于创建型软件设计模式,是指确保一个类仅有一个唯一的实例,并且提供一个全局的访问点。它必须满足以下要点:
1)某个类只能有一个实例
2)它必须自行创建这个实例
3)它必须自行向整个系统提供这个实例
优点在于节省了系统的资源空间。
行为型软件设计模式:
行为型软件设计模式在解释对象之间是怎样进行交互的,关心的不仅仅是描述对象或类的模式,而是侧重于描述他们之间的通信模式。具体有:迭代器模式、访问者模式、命令模式、中介者模式、策略模式和状态模式。
软件体系结构:
软件体系结构指的是程序或者系统的组成关系 ,这种组成关系包括软构件 ,软构件的外部可见属性及这些软构件之间的关系。包括三个要素:构件、连接件、约束。
软件体系结构风格:
是对软件体系结构的分类,每一种软件体系结构风格都代表一类软件的结构组织模式,是对实践中被重复使用的结构设计的总结。
课程内容
1.软件设计模式部分
1)软件设计模式的三个层次分别是什么?具体内容是什么?
三个层次分别是:架构模式 、设计模式 、习惯用法。
1)架构模式:是一种高层模式 ,用于描述系统级的结构组成、相互关系及相关约束,比如MVC(模型-视图-控制器)就是一种架构模式。
2)设计模式:是一种中层模式 ,是针对系统局部设计问题给出的解决方案。比如现在MVC架构中,采用的主要设计模式有观察者模式、组合模式等。
3)习惯用法:被认为是具体变成语言相关的一种低层模式。
2)常见的软件设计模式分类分为多少大类?其中面向对象设计模式是又分为多少类?分别是什么?
常见的软件设计模式分类分为面向对象 、分布式计算 、企业应用软件 、面向服务的体系结构。
面向对象设计模式分为:创建型模式 、结构型模式 、行为型模式。
创建型模式包括:工厂方法模式、抽象工厂模式、生成器模式和单例模式。
结构型模式包括:组合模式、适配器模式、外观模式和桥接模式。
行为型模式包括:迭代器模式、访问者模式、命令模式、中介者模式、策略模式和状态模式。
3)需详细了解以下设计模式
能画出设计类图、各部分组成说明,能写出具体代码例子:单例模式、抽象工厂模式、适配器模式、组合模式、观察者模式、代理模式
1.单例模式
设计类图:
各部分组成说明:
-
私有静态实例:确保单例类只有一个实例。
-
私有构造函数 :防止外部通过
new
创建实例。 -
公有静态方法:提供全局访问点,返回唯一的实例。
代码例子:
java
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
2.抽象工厂模式
设计类图:
各组成部分:
-
一系列互相有关联的产品类,这些产品类有相同的结构。
-
一系列工厂类,实现由抽象工厂类提供的接口。
代码例子:
java
public interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}
public class ConcreteFactory1 implements AbstractFactory {
public ProductA createProductA() {
return new ProductA1();
}
public ProductB createProductB() {
return new ProductB1();
}
}
public class ProductA {
}
public class ProductA1 extends ProductA {
}
public class ProductB {
}
public class ProductB1 extends ProductB {
}
3.适配器模式
设计类图:
各个组成部分:
-
Target:即所期望的java接口
-
Adaptee:被继承的java类
-
Adapter:将Adaptee类转化到增加了新功能的Target接口
代码例子:
java
public interface Target {
void request();
}
public class Adaptee {
public void specificRequest() {
System.out.println("Specific request");
}
}
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
public void request() {
adaptee.specificRequest();
}
}
4.组合模式
设计类图
各个组成部分
-
Component:为组合模式的对象声明接口,实现所有类共有接口的默认行为
-
Leaf:叶节点对象,没有子节点,并且实现Component的所有方法
-
Composite:组合部件,实现操纵子部件的所有方法
-
Client:通过Component接口操纵组合部件的对象
代码例子
java
public abstract class Composite {
public abstract void add(Composite component);
public abstract void remove(Composite component);
public abstract Composite getChild(int i);
}
public class Leaf extends Composite {
public void add(Composite component) {}
public void remove(Composite component) {}
public Composite getChild(int i) { return null; }
}
public class CompositeImpl extends Composite {
private ArrayList<Composite> children = new ArrayList<>();
public void add(Composite component) {
children.add(component);
}
public void remove(Composite component) {
children.remove(component);
}
public Composite getChild(int i) {
return children.get(i);
}
}
5.观察者模式
设计类图
各个组成部分:
-
Observable:被观察者接口,声明了三个应该实现的方法。
-
Subject:具体的观察者要依赖的对象,它要实现Observer的所有方法。
-
Observer:观察者接口,代表依赖对象。
-
ConcreteObserver:代表具体的依赖对象(观察者对象)。
代码例子:
java
public interface Observer {
void update(String message);
}
public interface Subject {
void registerObserver(Observer o);
void unregisterObserver(Observer o);
void notifyObservers();
}
public class ConcreteSubject implements Subject {
private ArrayList<Observer> observers = new ArrayList<>();
private String state;
public void registerObserver(Observer o) {
observers.add(o);
}
public void unregisterObserver(Observer o) {
observers.remove(o);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(state);
}
}
public void setState(String state) {
this.state = state;
notifyObservers();
}
}
public class ConcreteObserver implements Observer {
public void update(String message) {
System.out.println("Received update: " + message);
}
}
6.代理模式
设计类图
各个组成部分:
-
RealSubject
:被代理的对象。 -
Proxy
:代理对象,包含对RealSubject的引用。 -
Client
:使用代理对象
代码例子:
java
public interface Subject {
void request();
}
public class RealSubject implements Subject {
public void request() {
System.out.println("RealSubject: Handling request.");
}
}
public class Proxy implements Subject {
private RealSubject realSubject = new RealSubject();
public void request() {
preRequest();
realSubject.request();
postRequest();
}
private void preRequest() {
System.out.println("Proxy: Logging the time before request.");
}
private void postRequest() {
System.out.println("Proxy: Logging the time after request.");
}
}
2.软件体系结构部分
1)软件体系结构的意义(3点)
-
软件体系结构是软件相关人员之间进行交流的手段。
-
软件体系结构是一种高层次的设计复用手段。
-
软件体系结构是早期关键设计决策的体现。
2)软件质量属性简述(9点)
-
性能:指软件运行时系统的时间以及空间上的效率。
-
**可伸缩性:**系统能够平稳应对不断增长的处理任务的能力。
-
可用性:也称健壮性,指系统的容错以及从错误中恢复的能力,保证系统无论何时都能正常运行。
-
可维护性:指系统应对变化的能力,即系统可被修改的容易程度。
-
安全性:阻止未授权用户访问系统的能力,从而保护合法用户的数据安全。
-
易用性:指用户学习使用软件的容易程度、软件的使用效率。
-
可重用性:软件代码的可重用程度。
-
可测试性:软件可被测试的容易程度。
-
可移植性:软件在不同平台运行的能力。
3)三层客户端-服务器端体系结构的主要优点,以及利用三层客户端-服务器端体系结构设计的一个简单的业务系统
主要优点如下:
-
具有良好的灵活性和扩展性
-
开发语言独立
-
具有可共享性
-
具有较好的安全性
-
增强了企业对象的重复可用性
-
成为了真正意义上的瘦客户端,从而具备了很高的稳定性、延展性和执行效率
利用三层客户端-服务器端体系结构设计的一个简单的业务系统:
4)MVC软件体系结构的结构图,开发底线,优点和缺点
MVC结构图:
开发底线:
优点:
-
对于同一模型有不同的视图和控制器,以便提供给用户不同类型的用户图形界面
-
所有的视图都同时实时地反映了模型的现有状态
-
改变用户图形界面的非常容易
-
核心数据和功能都包含在模型中,易于测试
缺点:
-
复杂性增加
-
性能问题
3)补充内容
1.UML类图基本画法,包括继承、实现、依赖、关联、聚合和组合的图例画法
具体看以下视频:
【6 分钟学会 UML 类图】 6 分钟学会 UML 类图_哔哩哔哩_bilibili
2.阿里巴巴编程规范中的工程规约(图),了解各层内容(重点)
开放接口层:可直接封装 Service 方法暴露成 RPC 接口;通过 Web 封装成 http 接口;进行
网关安全控制、流量控制等。
终端显示层:各个端的模板渲染并执行显示的层。当前主要是 velocity 渲染,JS 渲染,
JSP 渲染,移动端展示等。
Web 层:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。
Service 层:相对具体的业务逻辑服务层。
Manager 层:通用业务处理层,它有如下特征:
1) 对第三方平台封装的层,预处理返回结果及转化异常信息;
2) 对 Service 层通用能力的下沉,如缓存方案、中间件通用处理;
3) 与 DAO 层交互,对多个 DAO 的组合复用。
DAO 层:数据访问层,与底层 MySQL、Oracle、Hbase 等进行数据交互。
外部接口或第三方平台:包括其它部门 RPC 开放接口,基础平台,其它公司的 HTTP 接口。
3.ORM相关内容,实体类声明,具体方法实现
ORM(Object-Relational Mapping,对象关系映射)是一种在编程中用于将对象模型映射到关系型数据库的技术。
实体类声明:
实体类是与数据库表相对应的类,每个实体类的实例代表数据库中的一条记录。实体类通常包含属性和方法,属性与数据库表的列相对应。
例如,一个用户实体类可能如下所示:
java
public class User {
private Long id;
private String name;
private String email;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
CRUD操作:ORM框架提供了创建(Create)、读取(Read)、更新(Update)和删除(Delete)数据库记录的方法。这些操作通常通过ORM框架的API来完成,而不是直接编写SQL语句。
例如,使用Hibernate ORM框架进行CRUD操作的代码如下:
java
// 创建Session工厂
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
// 创建新用户
User newUser = new User();
newUser.setName("John Doe");
newUser.setEmail("john.doe@example.com");
session.beginTransaction();
session.save(newUser);
session.getTransaction().commit();
// 读取用户
User user = session.get(User.class, 1L);
// 更新用户信息
user.setName("Jane Doe");
session.beginTransaction();
session.update(user);
session.getTransaction().commit();
// 删除用户
session.beginTransaction();
session.delete(user);
session.getTransaction().commit();
4.云计算中,常用的云服务和部署架构(图,及每部分说明)
硬件层:包括各类计算、存储及网络资源,通常是一些大型服务器集群,部署在数据中心里。
基础设施层:通过虚拟化技术对底层的硬件资源进行抽象并管理。
平台层:可看作为"云中间件"资源,这些资源包括应用容器、数据库、消息中间件等,对外提供面向网络应用开发及运行的平台服务。
应用层:云中应用软件的集合,面向最终用户通过网络提供各类软件服务。
5.消息中心服务应用场景,以及举出例子(前两项:异步解耦、削峰填谷)
-
异步解耦:在微服务架构中,各个服务之间通过消息中心进行通信,可以避免直接调用导致的强耦合。例如,一个电商平台的库存服务和支付服务。支付服务在处理支付后,需要向库存服务发送扣库存的请求,但不直接调用API,而是通过消息中心发送消息,让库存服务异步处理。这样,即使支付服务或库存服务发生变化,也不会直接影响到对方,从而提高了系统的灵活性和可维护性。
-
削峰填谷:在高并发场景下,如电商秒杀活动或支付系统高峰期,消息中心可以有效地进行削峰处理。通过将请求先排队到消息队列中,然后服务以稳定的速度从消息队列中消费消息,处理请求,从而避免服务器因瞬时高并发而崩溃。例如,在秒杀活动中,大量用户同时请求,消息中心通过把请求排队来平滑处理流量,避免服务器崩溃。
-
日志处理:消息中心可以用于集中处理和分发日志信息,如Kafka最初就是为了处理日志而设计的。在分布式系统中,各个服务可以将其日志信息发送到消息中心,然后由专门的日志处理服务进行收集、分析和存储。
-
应用解耦:消息中心可以作为不同应用之间的通信桥梁,实现应用之间的解耦。例如,一个订单系统需要通知库存系统扣减库存,还要通知支付系统完成扣款。通过消息中心,订单系统只需要把消息发送到消息队列,库存服务和支付服务各自从消息队列中消费消息,从而实现了解耦。
-
异步通知:在需要异步处理的场景下,如用户注册后发送欢迎邮件,订单完成后发送优惠券等,消息中心可以异步地处理这些通知任务,提高用户体验,同时不阻塞主流程。
-
分布式事务一致性:在需要保证分布式事务一致性的场景中,消息中心可以用于协调不同服务之间的事务操作,确保数据的最终一致性。
-
顺序收发:在需要保证消息顺序的场景,如证券交易、航班旅客登机消息处理等,消息中心可以提供顺序消息服务,保证消息的先进先出(FIFO)。
-
大数据分析:消息中心可以与流式计算引擎结合,实现对业务数据的实时分析,为大数据分析提供支持。