Java面试——设计模式
Posted CoDeiSlifE
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java面试——设计模式相关的知识,希望对你有一定的参考价值。
对软件设计中存在的问题的解决方案
代码设计的经验的总结
UML:统一建模语言;一种分析、设计语言
类之间的关系:
1 关联关系 (用实线箭头)
1.1 双向关联
1.2 单向关联
1.3 自关联
1.4 重数性关联
1.5 聚合 (A中有B,B可以独立存在 空心菱形加实线箭头)
1.6 组合 (A有B B有A 同生死 实心菱形加实现箭头)
2 依赖关系 (虚线箭头)
一般体现在某个类的方法使用另一个类的对象作为参数
3 泛化关系 (空心三角形实线)
继承关系
4 接口与实现关系 (空心三角形虚线)
一:设计模式原则
1:单一职责原则(SRP)
类的职责要单一,对于一个类而言应该仅有一个引起它变化的原因
不要让一个类承担过多的职责,如果承担过多的职责就等于把这些职责耦合在一起,一个职责的变化可能影响其他的职责
2:开放封闭原则
类、模块、函数等 应该对扩展开放,对修改关闭
抽象化是开闭原则的关键:通过抽象类 接口定义抽象层,再通过具体的类来进行扩展,如果需要修改系统的行为,就新增具体类实现,不用修改以前的代码
3:里氏替换原则
软件中将父类对象替换成子类对象,程序不会产生任何错误
子类可以扩展父类的功能,但不能修改父类原有的功能
4:依赖倒置原则
高层模块不应该依赖与低层模块,两个都应该依赖于抽象
抽象不依赖细节,细节依赖抽象
针对接口编程
例如:
mother.readr(new Book()); 如果参数换成Newspaper对象就不行了
修改:Book和Newspaper都实现接口IReader
mother.readr(IReader ireader);
5:接口隔离原则
客户端不应该依赖于它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上
尽量细化接口,接口中的方法尽量少,为各个类建立专用的接口,而不是建一个庞大的接口
6:合成复用原则
尽量使用对象组合,而不是使用继承
7:迪米特原则
一个对象应该对其他对象保持最少的了解
类与类之间关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大
二:23种设计模式
总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
创建型
- 工厂方法模式
说明:使用不同的工厂生产不同的产品
例:生产电视机的工厂,生产不同品牌的手机,如果只有一个工厂类,当需要增加一个品牌的手机时就需要修改代码,违反了开闭原则
改进:定义一个工厂接口,再定义不同的实现类分别去生产不同品牌的手机,增加品牌时只需要增加一个实现类即可
定义:工厂方法模式又称为工厂模式,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化那一个具体产品类
应用:如集合框架,Collection定义了iterator()。可返回一个用于遍历集合的Iterator(迭代器)对象,而具体的集合类通过实现该方法返回一个具体的Iterator对象,该iterator()方法就是工厂方法 - 抽象工厂模式
说明:具体的工厂生产不再是生产某一种产品,而是生产一系列产品
例:海尔工厂生产海尔电视机、海尔空调;TCL工厂生产TCL电视机、TCL空调
定义:提供一个创建一系列相关或相互依赖的对象的接口,而无需指定他们具体的类
- 单例模式
例:身份证号码是唯一的
静态私有成员变量、私有构造函数、静态公有获取实例的方法
定义:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类成为单例类,它提供全局访问的方法
应用:如java.lang.Runtime类,每个Java应用程序里,都有唯一的一个Runtime对象,通过这个对象可以与其运行环境发生相互作用。
在流行的JavaEE框架Spring中,当我们试图从spring容器中获取某个类的实例时,默认情况下,spring会通过单例模式进行创建,也就是在spring的bean工厂中这个bean的实例只有一个
<bean id = "date" class = "java.util.Date" scope = "singleton"/>
结构型
- 适配器模式
将一个接口转换成客户希望的另一个接口,从而使接口不兼容的那些类可以一起工作
定义:将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器
应用:数据库连接工具JDBC,使得程序能够与数据库连接,并使用SQL语言来查询和操作数据。JDBC给出一个客户端通用的抽象接口,每一个具体数据库引擎(如SQL Server、Oracle、mysql等)的JDBC驱动软件都是一个介于JDBC接口和数据库引擎接口之间的适配器软件。抽象的JDBC接口和各个数据库引擎API之间都需要相应的适配器软件,这就是为各个不同数据库引擎准备的驱动程序
- 外观模式
例:网站首页的导航栏,可以进入不同的子系统
定义:外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
外观模式是一个使用频率极高,理解比较容易的模式,在几乎所有的软件中都能见到外观模式的应用,比如绝大多数的B/S系统都有一个首页或者导航页面,在这里,首页和导航页面就是外观角色 - 代理模式
例:找女票,工作忙不能亲自找,找个婚介所(代理、中介、、、)
在某些情况下,一个客户不能或不想直接引用某个对象,此时可以通过一个称之为“代理”的第三者实现间接引用,代理对象起到中介作用,可以通过代理对象去掉客户能看到的内容和服务或者添加客户需要的额外服务
定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用
应用:spring框架中的AOP技术也是代理模式的应用
行为型
- 迭代器模式
例:看电视,通过遥控器,可以看不同的频道,电视机中有很多频道,通过遥控器遍历,而不需要知道这些频道在电视机内部是怎么存储的
定义:提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示
应用:Collection中的iterator()
在Java中,很少自定义迭代器,使用JDK内置的迭代器即可
- 观察者模式
例:点击一个按钮,弹出一个对话框;股票上涨,股民兴奋 在这里,按钮、股民是观察者,鼠标、股票是观察者所观察的目标
MVC架构中,Model提供的数据是视图层所观察的对象,相同的数据在view层可能有不同的表现形式,如果模型层数据发生变化,则图表对象也发生改变,意味着图表对象依赖于模型层提供的数据对象,因此数据对象的任何状态改变都应该立即通知它们
定义:定义对象间一种一对多的关系,使得每当一个对象发生改变时,其相关的依赖对象皆得到通知并自动更新 - 策略模式
用于算法的自由切换和扩展
定义:定义一些列算法,将每一个算法封装起来,并让他们可以相互替换。策略模式让算法独立预使用它们的客户而变化
策略模式的目的是将算法的定义预使用分开,也就是将算法的行为和环境分开,将算法的定义放在专门的策略类中,每一个策略类封装了一种算法实现,同时为了扩展方便,引入了抽象策略类,在抽象策略类中定义了抽象算法,环境类针对抽象策略类进行编程,符合“依赖倒转原则”。在出现心得算法时,只需要增加一个心得实现了抽象策略类的具体策略类。
以上是关于Java面试——设计模式的主要内容,如果未能解决你的问题,请参考以下文章