详解后端Java面试——OOA/D,UML,和XML

271 阅读9分钟

点关注,不迷路;持续更新Java架构相关技术及资讯热文!!!

1、UML 是什么?常用的几种UML图?

统一建模语言(Unified Modeling Language,UML)又称标准建模语言;常用图包括:用例图,静态图(包括类图、对象图和包图),行为图,交互图(顺序图, 协作图),实现图。

2、编程题: 写一个Singleton(单例模式) 出来。

Singleton 模式主要作用是保证在Java 应用程序中,一个类Class 只有一个实例存在。举例:定义一个类,它的构造函数为private 的,它有一个static的private 的该类变量,在类初始化时实例话,通过一个public 的getInstance方法获取对它的引用,继而调用其中的方法。

第一种饿汉式:

//饿汉式
public class Singleton {
	//私有化构造函数
	private Singleton() {
	}
	//创建一个对象
	private static Singleton instance = new Singleton();
	//提供公有方法返回该对象
	public static Singleton getInstance() {
		return instance;
	}
}

第二种懒汉式:

//懒汉式
public class Singleton {
	//私有化构造函数
	private Singleton(){
	}
	//创建一个空对象
	private static Singleton instance = null;
	//创建公有方法调用,对象如果为空创建对象,否则直接返回当前对象
	public static synchronized Singleton getInstance() {
		if (instance == null) {
			instance = new Singleton();
		}
		return instance;
	}
}

3、Java 中常用的设计模式?简述工厂模式?

Java 中的23 种设计模式可以分为三类:

创建型模式(5种)

Factory( 工厂模式),Builder( 建造者模式), Factory Method(工厂方法模式),Prototype(原型模式),Singleton(单例模式)。

结构型模式(7种)

Facade(外观模式),Adapter(适配器模式), Bridge(桥接模式), Composite(组合模式),Decorator(装饰器模式), Flyweight(享元模式), Proxy(代理模式)。

行为型模式(11种)

Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式),Iterator(迭代子模式), Mediator(中介者模式), Memento(备忘录模式),Observer(观察者模式),State(状态模式),Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)。

工厂模式

工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。

23种模式简单说明

  • 单例模式:某个类只能有一个实例,提供一个全局的访问点。
  • 简单工厂:一个工厂类根据传入的参量决定创建出那一种产品类的实例。
  • 工厂方法:定义一个创建对象的接口,让子类决定实例化那个类。
  • 建造者模式:封装一个复杂对象的构建过程,并可以按步骤构造。
  • 原型模式:通过复制现有的实例来创建新的实例。
  • 适配器模式:将一个类的方法接口转换成客户希望的另外一个接口。
  • 组合模式:将对象组合成树形结构以表示“”部分-整体“”的层次结构。
  • 装饰模式:动态的给对象添加新的功能。
  • 代理模式:为其他对象提供一个代理以便控制这个对象的访问。
  • 亨元(蝇量)模式:通过共享技术来有效的支持大量细粒度的对象。
  • 外观模式:对外提供一个统一的方法,来访问子系统中的一群接口。
  • 桥接模式:将抽象部分和它的实现部分分离,使它们都可以独立的变化。
  • 模板模式:定义一个算法结构,而将一些步骤延迟到子类实现。
  • 解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器。
  • 策略模式:定义一系列算法,把他们封装起来,并且使它们可以相互替换。
  • 状态模式:允许一个对象在其对象内部状态改变时改变它的行为。
  • 观察者模式:对象间的一对多的依赖关系。
  • 备忘录模式:在不破坏封装的前提下,保持对象的内部状态。
  • 中介者模式:用一个中介对象来封装一系列的对象交互。
  • 命令模式:将命令请求封装为一个对象,使得可以用不同的请求来进行参数化。
  • 访问者模式:在不改变数据结构的前提下,增加作用于一组对象元素的新功能。
  • 责任链模式:将请求的发送者和接收者解耦,使的多个对象都有处理这个请求的机会。
  • 迭代器模式:一种遍历访问聚合对象中各个元素的方法,不暴露该对象的内部结构。

4、开发中都用到了那些设计模式?用在什么场合?

所谓设计模式,就是一套被反复使用的代码设计经验的总结(情境中一个问题经过证实的一个解决方案)。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式使人们可以更加简单方便的复用成功的设计和体系结构。每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。

  • MVC模式,在JavaEE项目开发中主要用在表示层框架中,很好解决视图和流程控制。在项目中采用的Struts、SpringMVC等框架。
  • DAO模式,在项目开发中主要用在数据层,封装数据的访问操作,为业务层提供数据服务。
  • IoC模式,在项目开发中业务层有大量对象,他们之间存在依赖关系,可以使用IoC模式减少他们之间的代码耦合,提高系统的可扩展性。实际项目中使用的Spring框架来实现业务组件的装配。
  • Observer模式,在Servlet的监听器中应用到了观察者模式。
  • singleton单例模式和Factory工厂模式结合使用在项目中无需使用者了解过多的细节就可获取有关的对象实例。比如Hibernate项目中通过SessionFactory来获取Session。
  • bridge模式,在项目中使用JDBC驱动访问数据库。

5、你对软件开发中迭代的含义的理解。

软件开发中,各个开发阶段不是顺序执行的,各个阶段都是并行执行也就是迭代的意思。这样能更好的适应,开发中的需求变化,及人员的变动

6、XML 文档定义有几种形式?它们之间有何本质区别?解析XML 文档有哪几种方式?

  • 两种形式:dtd 以及schema;
  • 本质区别:schema 本身是xml 的,可以被XML 解析器解析(这也是从DTD上发展schema 的根本目的);
  • 解析方式
    • DOM解析: DOM的全称是Document Object Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。
    • SAX解析:SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。
    • JDOM解析:JDOM采用了Java中的Collection架构来封装集合,是Java爱好者更加熟悉的模式
    • DOM4J解析:xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容

7、你在项目中用到了xml 技术的哪些方面?怎么实现的?

用到了数据存贮,信息配置两方面

  • 在做数据交换平台时,将不能数据源的数据组装成XML 文件,然后将XML 文件压缩打包加密后通过网络传送给接收者,接收解密与解压缩后再同XML 文件中还原相关信息进行处理。

  • 在做软件配置时,利用XML 可以很方便的进行,软件的各种配置参数都存贮在XML 文件中。

8、用jdom 解析xml 文件时如何解决中文问题?如何解析?

代码如下,用编码方式加以解决

public class DOMTest {
	// 文件路径
	private String outFile = "F:\people.xml";
	public static void main(String args[]) {
		new DOMTest();
	}
	public DOMTest() {
		try {
			// 1、获取DOM解析器工厂,以便产生解析器;2、获取DOM解析器,以便解析DOM
			DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
			Document doc = builder.newDocument();
			// 3.创建元素
			Element root = doc.createElement("老师");
			Element wang = doc.createElement("许");
			// 4.向指定元素节点中增加子元素节点或增加元素到子节点
			wang.appendChild(doc.createTextNode("我是许老师"));
			root.appendChild(wang);
			doc.appendChild(root);
			// 5.设置然后把DOM写回XML文件
			Transformer transformer = TransformerFactory.newInstance().newTransformer();
			// 6.指定Transformer应该使用的首选字符编码,将字符序列作为字节序列进行编码
			transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
			// 7.指定Transformer是否可以添加额外的空白,同时输出
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			transformer.transform(new DOMSource(doc),
			              new StreamResult(outFile));
		}
		catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
}

文件效果

写在最后

最后,欢迎做Java的工程师朋友们加入Java高级架构进阶Qqun:963944895

群内有技术大咖指点难题,还提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)

比你优秀的对手在学习,你的仇人在磨刀,你的闺蜜在减肥,隔壁老王在练腰, 我们必须不断学习,否则我们将被学习者超越!

趁年轻,使劲拼,给未来的自己一个交代!