public class SingleObject { //创建 SingleObject 的一个对象 private static SingleObject instance = new SingleObject(); //让构造函数为 private,这样该类就不会被实例化 private SingleObject(){} //获取唯一可用的对象 public static SingleObject getInstance(){ return instance; } public void showMessage(){ System.out.println(“Hello World!”); } } public class SingletonPatternDemo { public static void main(String[] args) { //获取唯一可用的对象 SingleObject object = SingleObject.getInstance(); //显示消息 object.showMessage(); } }
public class SingleObject { //创建 SingleObject 的一个对象 private static SingleObject instance = new SingleObject(); //让构造函数为 private,这样该类就不会被实例化 private SingleObject(){} //获取唯一可用的对象 public static SingleObject getInstance(){ return instance; } public void showMessage(){ System.out.println("Hello World!"); } }
public class SingletonPatternDemo { public static void main(String[] args) { //获取唯一可用的对象 SingleObject object = SingleObject.getInstance(); //显示消息 object.showMessage(); } }
抽象工厂模式:
提供一个接口,可以创建一系列相关或相互依赖的对象,而无需指定它们具体的类
AbstractFactory:抽象工厂,声明抽象产品的方法
ConcreteFactory:具体工厂,执行生成抽象产品的方法,生成一个具体的产品
AbstractProduct:抽象产品,为一种产品声明接口
Product:具体产品,定义具体工厂生成的具体产品的对象,实现产品接口
Client:客户,应用程序使用抽象产品和抽象工厂生成对象
/* 抽象工厂的抽象类,Java定义为接口*/ public interface AbstractFactory { //创建产品的方法 public AbstractProductA CreateProductA(); public AbstractProductB CreateProductB(); } /*抽象产品接口*/ public interface AbstractProductA { } public interface AbstractProductB { } /*实际的产品*/ public class ProductA1 implements AbstractProductA { //实际的产品A1 } public class ProductA2 implements AbstractProductA { //实际的产品A2 } public class ProductB1 implements AbstractProductB { //实际的产品B1 } public class ProductB2 implements AbstractProductB { //实际的产品B2 } /*在以下程序中,CFactory是ConcreteFactory的简写*/ /*在第1个车间中,创建实际产品A1*/ public class CFactory1 implements AbstractFactory { public AbstractProductA CreateProductA() { return new ProductA1(); } } /*在第1个车间中,创建实际产品B1*/ public class CFactory1 implements AbstractFactory { public AbstractProductB CreateProductB() { return new ProductB1(); } } /*在第2个车间中,创建实际产品A2*/ public class CFactory2 implements AbstractFactory { public AbstractProductA CreateProductA() { return new ProductA2(); } } /*在第2个车间中,创建实际产品B2*/ public class CFactory2 implements AbstractFactory { public AbstractProductB CreateProductB() { return new ProductB2(); } }
观察者模式:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新
抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
具体主题(Concrete Subject)角色:也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
抽象观察者(Observer)角色:它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
具体观察者(Concrete Observer)角色:实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。
import java.util.*; public class ObserverPattern { public static void main(String[] args) { Subject subject=new ConcreteSubject(); Observer obs1=new ConcreteObserver1(); Observer obs2=new ConcreteObserver2(); subject.add(obs1); subject.add(obs2); subject.notifyObserver(); } } //抽象目标 abstract class Subject { protected List<Observer> observers=new ArrayList<Observer>(); //增加观察者方法 public void add(Observer observer) { observers.add(observer); } //删除观察者方法 public void remove(Observer observer) { observers.remove(observer); } public abstract void notifyObserver(); //通知观察者方法 } //具体目标 class ConcreteSubject extends Subject { public void notifyObserver() { System.out.println("具体目标发生改变..."); System.out.println("--------------"); for(Object obs:observers) { ((Observer)obs).response(); } } } //抽象观察者 interface Observer { void response(); //反应 } //具体观察者1 class ConcreteObserver1 implements Observer { public void response() { System.out.println("具体观察者1作出反应!"); } } //具体观察者1 class ConcreteObserver2 implements Observer { public void response() { System.out.println("具体观察者2作出反应!"); } }
组合模式:
将对象组合成树型结构以表示“整体-部分”的层次结构,使得用户对单个对象和组合对象的使用具有一致性
我们有一个类 Employee,该类被当作组合模型类。CompositePatternDemo,我们的演示类使用 Employee 类来添加部门层次结构,并打印所有员工。
import java.util.ArrayList; import java.util.List; public class Employee { private String name; private String dept; private int salary; private List<Employee> subordinates; //构造函数 public Employee(String name,String dept, int sal) { this.name = name; this.dept = dept; this.salary = sal; subordinates = new ArrayList<Employee>(); } public void add(Employee e) { subordinates.add(e); } public void remove(Employee e) { subordinates.remove(e); } public List<Employee> getSubordinates(){ return subordinates; } public String toString(){ return ("Employee :[ Name : "+ name +", dept : "+ dept + ", salary :" + salary+" ]"); } }
import java.util.ArrayList; import java.util.List; public class Employee { private String name; private String dept; private int salary; private List<Employee> subordinates; //构造函数 public Employee(String name,String dept, int sal) { this.name = name; this.dept = dept; this.salary = sal; subordinates = new ArrayList<Employee>(); } public void add(Employee e) { subordinates.add(e); } public void remove(Employee e) { subordinates.remove(e); } public List<Employee> getSubordinates(){ return subordinates; } public String toString(){ return ("Employee :[ Name : "+ name +", dept : "+ dept + ", salary :" + salary+" ]"); } }
9. 中间件概念:
中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于操作系统之上,管理计算资源和网络通信,实现应用之间的互操作。
10. 中间件功能:
(1) 负责客户机与服务器之间的连接和通信,以及客户机与应用层之间的高效率通信机制。
(2) 提供应用层不同服务之间的互操作机制,以及应用层与数据库之间的连接和控制机制。
(3) 提供一个多层体系结构的应用开发和运行的平台,以及一个应用开发框架,支持模块化的应用开发。
(4) 屏蔽硬件、操作系统、网络和数据库的差异。
(5) 提供应用的负载均衡和高可用性、安全机制与管理功能,以及交易管理机制,保证交易的一致性。
(6) 提供一组通用的服务去执行不同的功能,避免重复的工作和使应用之间可以协作。
11. 消息中间件定义和使用场景:
(1)定义:消息中间件属于分布式系统中一个子系统,关注于数据的发送和接收,利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。
(2)使用场景:
四个典型场景:典型的异步处理、应用解耦、流量削锋、消息通讯四个场景。
举例:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。(流量削锋)
11.常用消息中间件:
ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ。
12.I/O模型:
(1)阻塞I/O模型:进程或线程等待某个条件,如果条件不满足,则一直等下去。条件满足,则进行下一步操作。
(2)非阻塞I/O模型:应用进程与内核交互,目的未达到时,不再一味的等着,而是直接返回。然后通过轮询的方式,不停的去问内核数据准备好没。
(3)I/O 复用模型
一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,select()函数就可以返回。
(4)信号驱动式 I/O 模型
首先开启Socket信号驱动I/O功能,并通过系统调用sigaction执行一个信号处理函数(此系统调用立即返回,进程继续工作,它是非阻塞的)。当数据准备就绪时,就为进程生成一个SIGIO信号,通过信号会掉通知应用程序调用recvfrom来读取数据,并通知主循环函数来处理数据。
(5)异步 I/O 模型
告知内核启动某个操作,并让内核在整个操作完成后(包括将数据从内核复制到用户自己的缓冲区)通知开发者。
第十一章
1. *软件质量属性:*
性能、可靠性(容错,健壮性),可用性,安全性,可修改性(可维护性,可扩展性,结构重组,可移植性),功能性,可变性,继承性,互操作性。
2. *评估的主要方式:*
基于调查问卷或检查表的评估方式,基于场景的评估方式,基于度量的评估方式
3. *ATAM评估步骤:*
描述ATAM方法;描述业务动机;描述架构;确定架构方法;生成质量属性效用树;分析架构方法;讨论场最和对场景分级.;分析架构方法;描述评估结果。
4. *SAAM评估步骤:*
形成场景、描述体系结构、对场景进行分类和确定优先级、对间接场景进行单个评估、评估场景的相互作用、形成总体评价
第十三章
1.软件产品线定义:产品线是一个产品集合,这些产品共享一个公共的、可管理的特征集,这个特征集能满足选定的市场或任务领域的特定需求。这些系统遵循一个预描述的方式,在公共的核心资源基础上开发的
检查表的评估方式,基于场景的评估方式,基于度量的评估方式
3. *ATAM评估步骤:*
描述ATAM方法;描述业务动机;描述架构;确定架构方法;生成质量属性效用树;分析架构方法;讨论场最和对场景分级.;分析架构方法;描述评估结果。
4. *SAAM评估步骤:*
形成场景、描述体系结构、对场景进行分类和确定优先级、对间接场景进行单个评估、评估场景的相互作用、形成总体评价
第十三章
1.软件产品线定义:产品线是一个产品集合,这些产品共享一个公共的、可管理的特征集,这个特征集能满足选定的市场或任务领域的特定需求。这些系统遵循一个预描述的方式,在公共的核心资源基础上开发的