一.软件详细设计
自选一个项目,完成一个模块的详细设计,具体包括:
1.描述清楚项目名称,模块功能
2.UML类图
3.正向工程源码
public class Ability {
String abilityName=null;
public Ability(){
}
public String getAbilitylName() {
return abilityName;
}
public void setAbilityName(String abilityName) {
this.abilityName = abilityName;
}
}
public class Learn extends Ability{
public Learn(String abilityName) {
super();
this.abilityName = abilityName;
}
public void JavaClass(){
System.out.println(this.abilityName+"我擅长Java语言!");
}
public void math(){
System.out.println(this.abilityName+"我擅长高等数学!");
}
}
public class Sports extends Ability{
public Sports(String abilityName) {
super();
this.abilityName = abilityName;
}
public void run(){
System.out.println(this.abilityName+"我擅长长跑!");
}
public void climb(){
System.out.println(this.abilityName+"我擅长攀岩!");
}
}public class Main {
public static void main(String[] args) {
Ability abilityLearn = new Learn("学习能力");
Learn learn = (Learn) abilityLearn;
learn.JavaClass();
learn.math();
Ability abilitySports = new Sports("运动能力");
Sports sports = (Sports) abilitySports;
sports.run();
sports.climb();
}
}
二.软件设计模式:单例模式类图及两种实现方式源码(自定义类)
双重检查模式DCL:
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){
}
public static Singleton getInstance() {
if (instance== null) {
synchronized (Singleton.class) {
if (instance== null) {
instance= new Singleton();
}
}
}
return singleton;
}
}
静态内部类实现:
public class Singleton {
private Singleton() {
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
/**
* 静态内部类
*/
private static class SingletonHolder {
private static Singleton instance = new Singleton();
}
}
package Operation;
public abstract class Operation {
double numberA=0;
double numberB=0;
public double getNumberA() {
return numberA;
}
public void setNumberA(double numberA) {
this.numberA = numberA;
}
public double getNumberB() {
return numberB;
}
public void setNumberB(double numberB) {
this.numberB = numberB;
}
public abstract double operate();
}
加类:
Java代码
package Operation;
public class Add extends Operation {
@Override
public double operate() {
return numberA+numberB;
}
}
减类:
Java代码
package Operation;
public class Sub extends Operation {
@Override
public double operate() {
return numberA-numberB;
}
}
乘类:
Java代码
package Operation;
public class Mul extends Operation {
@Override
public double operate() {
return numberA*numberB;
}
}
除类:
Java代码
package Operation;
import java.io.IOError;
public class Div extends Operation {
@Override
public double operate() {
try {
return numberA/numberB;
} catch (IOError e) {
System.out.println("除数不能为空!");
return 0;
}
}
}
工厂类:
Java代码
import Operation.Add;
import Operation.Div;
import Operation.Mul;
import Operation.Operation;
import Operation.Sub;
public class OperationFactory {
public static Operation createOperation(char operate){
Operation operation=null;
switch (operate) {
case '+':
operation=new Add();
break;
case '-':
operation=new Sub();
break;
case '*':
operation=new Mul();
break;
case '/':
operation=new Div();
break;
}
return operation;
}
}
客户端:
Java代码
import Operation.Operation;
public class Client {
public static void main(String[] args) {
Operation operation = OperationFactory.createOperation('*');
operation.setNumberA(12);
operation.setNumberB(6);
System.out.println(operation.operate());
}
}
package com.amosli.dp.behavior.template;
public abstract class AbstractClass {
public void templateMethod(){
primitiveMethod1();
primitiveMethod2();
}
public abstract void primitiveMethod1();
public abstract void primitiveMethod2();
}
package com.amosli.dp.behavior.template;
public class ConcreteClassA extends AbstractClass{
@Override
public void primitiveMethod1() {
System.out.println("ConcreteClassA primitive method 1...");
}
@Override
public void primitiveMethod2() {
System.out.println("ConcreteClassA primitive method 2...");
}
}
package com.amosli.dp.behavior.template;
public class ConcreteClassB extends AbstractClass{
@Override
public void primitiveMethod1() {
System.out.println("ConcreteClassB primitive method 1...");
}
@Override
public void primitiveMethod2() {
System.out.println("ConcreteClassB primitive method 2...");
}
}
package com.amosli.dp.behavior.template;
public class Client {
public static void main(String[] args) {
AbstractClass abstractClass = new ConcreteClassA();
abstractClass.templateMethod();
abstractClass = new ConcreteClassB();
abstractClass.templateMethod();
}
}
五.软件架构:请阐述分布式服务框架Dubbo,包括:
1)Dubbo是什么
2)Dubbo有什么用
3)为什么使用Dubbo
4)什么时候使用Dubbo
答:1、Dubbo是什么?
Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,现已成为 Apache 基金会孵化项目,是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
2、为什么要用Dubbo?
因为是阿里开源项目,国内很多互联网公司都在用,已经经过很多线上考验。内部使用了 Netty、Zookeeper,保证了高性能高可用性。
使用 Dubbo 可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,可用于提高业务复用灵活扩展,使前端应用能更快速的响应多变的市场需求。
当网站规模达到了一定的量级的时候,普通的MVC框架已经不能满足我们的需求,于是分布式的服务框架和流动式的架构就凸显出来了。
3.有什么用
1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
Dubbo的存在简单来说就是要减小service层的压力。
4.什么时候使用
当网站变大后,不可避免的需要拆分应用进行服务化,以提高开发效率,调优性能,节省关键竞争资源等。
当服务越来越多时,服务的URL地址信息就会爆炸式增长,配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。
当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。
六.软件架构:请阐述Redis,包括:
1)Redis是什么
2)Redis有什么用
3)为什么使用Redis
4)什么场景下使用Redis
答:1 redis是什么?
通常而言目前的数据库分类有几种,包括 SQL/NSQL,,关系数据库,键值数据库等等 等,分类的标准也不以,Redis本质上也是一种键值数据库的,但它在保持键值数据库简单快捷特点的同时,又吸收了部分关系数据库的优点。从而使它的位置处于关系数据库和键值数 据库之间。Redis不仅能保存Strings类型的数据,还能保存Lists类型(有序)和Sets类型(无序)的数据,而且还能完成排序(SORT) 等高级功能,在实现INCR,SETNX等功能的时候,保证了其操作的原子性,除此以外,还支持主从复制等功能。
2 Redis有什么用?
通常局限点来说,Redis也以消息队列的形式存在,作为内嵌的List存在,满足实时的高并发需求。而通常在一个电商类型的数据处理过程之中,有关商品,热销,推荐排序的队列,通常存放在Redis之中,期间也包扩Storm对于Redis列表的读取和更新。
3、为什么使用
解决应用服务器的cpu和内存压力
减少io的读操作,减轻io的压力
关系型数据库的扩展性不强,难以改变表结构
4、什么时候用:
数据高并发的读写
海量数据的读写
对扩展性要求高的数据
七.软件架构:请阐述RabbitMQ,包括:
1)RabbitMQ是什么
2)RabbitMQ有什么用
3)为什么使用RabbitMQ
4)什么场景下使用RabbitMQ
答:1.什么是rabbitmq
RabbitMQ是支持持久化消息队列的消息中间件。应用在上下游的层次级业务逻辑中,上级业务逻辑相当于生产者发布消息,下级业务逻辑相当于消费者接受到消息并且消费消息。
采用AMQP高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦
2.为什么要使用rabbitmq
1.在分布式系统下具备异步,削峰,负载均衡等一系列高级功能;
2.拥有持久化的机制,进程消息,队列中的信息也可以保存下来。
3.实现消费者和生产者之间的解耦。
4.对于高并发场景下,利用消息队列可以使得同步访问变为串行访问达到一定量的限流,利于数据库的操作。
5.可以使用消息队列达到异步下单的效果,排队中,后台进行逻辑下单。
3、有什么用:
1.解耦,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦!
2.异步,将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度
3.削峰,并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常
4.什么时候使用rabbitmq的场景
1.服务间异步通信
2.顺序消费
3.定时任务
4.请求削峰
八、SpringAOP体现了哪些软件设计原则,有什么好处
开闭原则、里式替换原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特原则
Aop优点减少重复代码,提高开发效率,不修改源码对已有方法进行增强。
九、Spring中的IOC体现了哪些软件设计原则?有什么好处
开闭原则、里式替换原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特原则、合成复用原则、
优点:当下层需要改变时,只要接口及接口功能不变,则上层不需要做任何改变,甚至可以在不改动上层代码是将下层整个替换掉