设计模式及原则相关问题
文章目录
- 介绍
- 问题
- 总结
介绍
一、什么是设计模式?
1.1 软件设计原则
开闭原则 : 对扩展开放, 对修改关闭
依赖倒置原则: 面向抽象,面向接口编程
单一职责原则: 一个类,一个接口,一个方法只负责一个职责
接口隔离原则 : 多个专门的接口替换一个总接口,从而保证客户端不需要依赖它不需要的接口
迪米特法则 : 最少知道原则, 减少耦合性
里氏替换原则 : 扩展父类功能,但是不会改变父类的功能
合成复用原则 : 尽量使用对象组合,聚合, 减少使用继承来达到复用的目的, 降低类与类的耦合性.
详细介绍如下:
开闭原则
定义
一个软件实体对扩展开发, 对修改关闭
软件实体
类
模块
函数
用抽象构建框架, 用实现扩展细节
优点
提高软件的可复用性和可扩展性
缺点
常见应用
依赖倒置原则
定义
高层模块不应该依赖低层模块
二者都应该依赖抽象
抽象不应该依赖细节, 细节应该依赖抽象
针对接口编程, 不要针对实现编程
优点
减少耦合性
提高系统稳定性
提高可读性和可维护性, 减少修改程序造成的风险
缺点
常见应用
单一职责原则
定义
不要存在多于一个导致类变更的原因
一个类,接口,方法只负责一个职责
优点
降低类的复杂度
提高可读性
提高可维护性
降低变更造成的风险
常见应用
接口隔离原则
定义
用多个专门的接口
而不是使用单一的总接口
客户端不应该依赖它不需要的接口
注意
一个类对另一个类的依赖应该建立在最小的接口上
建立单一接口, 不要臃肿
尽量细化接口, 接口中的方法尽量少
注意适度原则,一定要适度
优点
高内聚,低耦合
可读性,可扩展性,可维护性
常见应用
迪米特法则
定义
一个对象应该保持对其他对象最少的了解
最少知道原则
尽量减低类与类之间的耦合
优点
降低类与类之间的耦合
强调
只和朋友交流, 不和陌生人说话
朋友
出现在成员变量,成员方法的输入输出参数中的类成为了成员朋友类
出现在方法体内部的类不属于朋友类
里氏替换原则
定义
术语定义
如果对每一个对象类型为T1的对象o1, 都有类型为T2的对象o2,使得以T1定义的所有程序P
在所有的对象o1都替换成o2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型.
定义扩展
一个软件实体如果适用一个父类的话,那么一定适用于其子类,所有引用父类的地方必须
能透明地使用其子类的对象,子类对象能够替换父类对象,而程序逻辑不变.
引申含义
子类可以扩展父类的功能,但不能改变父类原有的功能
含义1
子类可以覆盖父类的抽象方法,但不能覆盖父类的非抽象方法
含义2
子类可以增加自己特有的方法
含义3
当子类的方法重载父类的方法时,方法的前置条件要比父类方法的输入参数更加宽松
前置条件
即方法的输入参数
含义4
当子类的方法实现父类的方法时,方法的后置条件要比父类更严格或相等
子类实现父类
重写,重载或实现抽象方法
后置条件
方法的输出,返回值
优点
约束继承泛滥, 开闭原则的一种体现
加强健壮性
提高兼容性
提高维护性,扩展性
合成复用原则
合成(组合),聚合复用原则定义
定义
尽量使用对象组合,聚合而不是继承关系达到复用的目的
聚合has-a
组合contains-a
优点
提高系统的灵活性
降低类与类的耦合性
一个类的变化对其他类的影响相对较少
何时使用
合成/聚合?
继承?
使用场景
软件最终原则参考标准
健壮性
扩展性
高性能
安全性
稳定性
可读性
可维护性
复用性
减少很多重复劳动
抽象就能提高复用性
面向接口在一定程度也能提高复用性
概念词理解
高层模块
低层模块
依赖关系
抽象
将实际的依赖抽象出来, 抽象成抽象的依赖, 用抽象的依赖代表一切实际的依赖
1.2 设计模式大介绍
创建型模式
结构型模式
行为型模式
二、问题
2.1 什么是设计模式?
2.2 设计模式用来干什么?
2.3 常见软件设计原则是哪些? 或者是基本的Java编程设计应遵循的规则?
2.4 什么是对象粒度?
2.5 设计模式的应用范围?
2.6 简述什么是单例模式,以及它解决的问题,应用的环境,解决的方案,模式的本质?
2.7 代码示例: 单例模式的两种实现方法, 并说明缺点?
2.8 简述什么是工厂模式,以及它解决的问题,应用的环境,解决的方案,模式的本质?
2.9 代码示例: 工厂模式的实现方法
2.10 简述什么是值对象模式,以及它解决的问题,应用的环境,解决的方案,模式的本质?
2.11 代码示例: 值对象模式的实现方法
2.12 简述什么是DAO模式,以及它解决的问题,应用的环境,解决的方案,模式的本质?
2.13 代码示例:DAO模式的实现方法
2.14 什么是开放-封闭原则(OCP)?
2.15 什么是里氏替换原则(LSP)?
2.16 什么是依赖倒置原则?聊一聊Spring的IOC,DI?
2.17 什么是单一职责原则?
2.18 什么是接口隔离原则?
2.19 什么是迪米特原则?
2.20 什么是合成复用原则?
2.21 如何综合使用我们学过的设计模式来 构建合理的应用程序结构
2.22 构建常用的合理的Java应用包结构
设计部分
2.23 举出一个例子,在这种情况下你会更倾向于使用抽象类,而不是接口?
2.24 设计一个贩卖机,可以接收不同的货币,出售不同的产品?
需求->设计->详细设计->代码实现->测试查看结构
2.25 你有一个SmartPhone类,可以派生如IPhone, AndriodPhone, WindowsMobilePhone类
它还可以是一些有着品牌的手机名称, 你怎么设计呢?
属于设计模式题目
2.26 在Java中, 什么时候用重载, 什么时候用重写?
2.27 设计一个ATM机?
考虑内容:
金融系统
事务
锁
边界条件
错误条件
2.28 根据12306的界面设计画出UML类图以及时序图?
2.29 你正在写一些类提供市场数据,你知道可以不定时切换厂商如Reuters, wombat或者直接的批发商, 你会如何设计你的市场数据系统?
2.30 在Java中,为什么不允许从静态方法中访问非静态变量?
2.31 在Java中设计一个并发规则的pipeline?
开始部分
2.32 什么是设计模式, 你是否在你的代码里面使用过任何设计模式?
2.33 你可以说出JDK中使用的设计模式吗?
2.34 Java中什么是单例模式?用Java写出线程安全的代码?
2.35 使用工厂模式最主要的好处是什么?你在哪使用过吗?
2.36 在Java中,什么叫做观察者模式?
2.37 什么是MVC设计模式?举一个MVC设计模式的例子?
2.38 Java中什么是表示层设计模式?举一个表示层设计模式的例子?
2.39 什么是责任链模式?
2.40 什么是适配器模式?举用Java实现适配器模式的例子?