软件设计与体系结构U+平台考试

一.软件详细设计
自选一个项目,完成一个模块的详细设计,具体包括:
1.描述清楚项目名称,模块功能
2.UML类图
3.正向工程源码
软件设计与体系结构U+平台考试_第1张图片

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();
	    }
	}

二.软件设计模式:单例模式类图及两种实现方式源码(自定义类)
软件设计与体系结构U+平台考试_第2张图片

双重检查模式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();
    }
}

三.软件设计模式:简单工厂模式类图及源码软件设计与体系结构U+平台考试_第3张图片

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());   
    }   
}  

四.设计软件模式:模板方法模式类图及源码
软件设计与体系结构U+平台考试_第4张图片

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体现了哪些软件设计原则?有什么好处
开闭原则、里式替换原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特原则、合成复用原则、
优点:当下层需要改变时,只要接口及接口功能不变,则上层不需要做任何改变,甚至可以在不改动上层代码是将下层整个替换掉

你可能感兴趣的:(笔记)