Android⾯试题常见设计模式
设计模式六⼤原则
1、开闭原则
对扩展开放,对修改关闭。在程序需要进⾏拓展的时候,不能去修改原有的代码
2、⾥⽒代换原则
所有引⽤⽗类的地⽅必须能透明地使⽤其⼦类的对象
3、依赖倒转原则
这个原则是开闭原则的基础,具体指针对接⼝编程,依赖于抽象⽽不依赖于具体
4、接⼝隔离原则
使⽤多个隔离的接⼝,⽐使⽤单个接⼝要好。降低类之间的耦合度
5、迪⽶特法则(最少知道原则)
⼀个实体应当尽量少地与其他实体之间发⽣相互作⽤,使得系统功能模块相对独⽴
6、合成复⽤原则
尽量使⽤合成/聚合的⽅式,⽽不是使⽤继承
单例模式
1、概念
单例模式是⼀种对象创建模式,它⽤于产⽣⼀个对象的具体实例,它可以确保系统中的⼀个类只产⽣⼀个实例2、好处
省略创建对象所花费的时间
对系统内存的使⽤频率降低,减轻GC压⼒,缩短GC停顿时间
3、六种写法
饿汉模式
public class HungurySingleton {
private static final HungurySingleton mHungurySingleton = new HungurySingleton();
private HungurySingleton(){
}
public static HungurySingleton getHungurySingleton() {
return mHungurySingleton;
}
alertdialog使用方法}
不⾜:⽆法对instance实例做延时加载
优化:懒汉模式
懒汉模式
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {
}
public static LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
不⾜:在多线程并发时⽆法保证实例唯⼀
优化:懒汉线程安全
懒汉线程安全
public class LazySafetySingleton {
private static LazySafetySingleton instance;
private LazySafetySingleton (){
}
//⽅式⼀
public static synchronized LazySafetySingleton getInstance() {
if (instance == null) {
instance = new LazySafetySingleton();
}
return instance;
}
//⽅式⼆
public static LazySafetySingleton getInstance1() {
synchronized (LazySafetySingleton.class) {
if(instance == null){
instance = new LazySafetySingleton();
}
}
return instance;
}
}
不⾜:JVM的即时编译器中存在指令重排序的优化
解决:将实例设置为Volatile
优化:静态内部类/枚举
静态内部类
public class StaticInnerSingleton {
private StaticInnerSingleton() {
}
public static StaticInnerSingleton getInstance() {
return SingletonHolder.sInstance;
}
private static class SingletonHolder {
private static final StaticInnerSingleton sInstance = new StaticInnerSingleton(); }
}
优点:
运⽤类中静态变量的唯⼀性
JVM本⾝同步控制机制(final、static)保证了线程安全
没有使⽤Synchronized,保证了性能的优化
静态内部类是私有的,除了外部类其他是⽆法访问的
枚举
public enum EnumSingleton {
INSTANCE;
public void doSomeThing() {
}
}
优点:
写法简单/线程安全(限于只有枚举的实例⽅法)
4、Android中的单例
application、eventBus
建造者模式
1、概念
建造者模式是较为复杂的创建型模式,它将客户端与包含多个组成部分的复杂对象的创建过程分离
2、使⽤场景
当构造⼀个对象需要很多参数的时候,并且参数的个数或者类型不固定的时候
3、UML图分析
4、在Android中应⽤
AlertDialog、Glide、OkHttp
适配器模式
1、概念
将⼀个接⼝转换成客户希望的另⼀个接⼝,适配器模式使接⼝不兼容的那些类可以⼀起⼯作,其别名⼜称包装类
2、分类
类适配器
对象适配器
3、类适配器定义
类的适配器模式把适配的类的API转换成为⽬标类的API
4、类适配器UML图分析
5、对象适配器定义
与类的适配器模式⼀样,对象的适配器模式把被适配的类的API转换成为⽬标类的API,与类的适配器模式不同的是,对象的适配器模式不是使⽤继承关系连接到Adaptee类,⽽是使⽤委派关系连接到Adaptee类
6、对象适配器UML图分析
7、在Android中应⽤
BaseAdapter类
装饰模式
1、概念
动态地给⼀个对象增加⼀些额外的职责,就增加对象功能来说,装饰模式⽐⽣成⼦类实现更为灵活
2、使⽤场景
在不影响其他对象的情况下,以动态、透明的⽅式给单个对象添加职责
当不能采⽤集成的⽅式对系统进⾏拓展或者采⽤继承不利于系统拓展和维护时可以使⽤装饰模式
3、UML图分析
4、优点
对于拓展⼀个对象的功能,装饰模式⽐继承更加灵活,不会导致类的个数急剧增加
可以通过⼀种动态的⽅式来拓展⼀个对象的功能
可以对⼀个对象进⾏多次装饰,通过使⽤不同的具体装饰类以及这些装饰类的排列组合
5、在Android中应⽤
context类
外观模式
1、概念
外观模式的主要⽬的在于让外部减少与⼦系统内部多个模块的交互,从⽽让外部能够更简单得使⽤⼦系统,它负责把客户端的请求转发给⼦系统内部的各个的模块进⾏处理
2、使⽤场景
当你要为⼀个复杂⼦系统提供⼀个简单接⼝时
客户程序与抽象类的实现部分之间存在很⼤的依赖性
当你需要构建⼀个层次结构的⼦系统时
3、UML图分析
4、优点
由于Facade类封装了各个模块交互的过程,如果今后内部模块调⽤关系发⽣了变化,只需要修改Facade实现就可以了
Facade实现是可以被多个客户端调⽤的
5、在Android中应⽤
contextImpl类
组合模式
1、概念
将对象以树形结构组织起来,以达到“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使⽤具有⼀致性
2、使⽤场景
需要表⽰⼀个对象整体或部分层次
让客户能够忽略不同对象层次的变化
3、UML图分析
UML图的Composite理解成Container容器更为合适,Container容器会包含有多个Component组件
4、优点
⾼层模块调⽤简单
节点⾃由增加
5、在Android中应⽤
View、ViewGroup
策略模式
1、概念
定义⼀系列的算法,把它们⼀个个封装起来,并且使他们可互相替换,本模式使得算法可独⽴于使⽤它的客户⽽变化
2、使⽤场景
⼀个类定义了多种⾏为,并且这些⾏为在这个类的⽅法中以多个条件语句的形式出现,那么可以使⽤策略模式避免在类中使⽤⼤量的条件语句
3、UML图分析
4、优点
上下⽂(Context)和具体策略(AbstractStrange)是松耦合关系
策略模式满⾜“开闭原则”
5、在Android中应⽤
Volley、属性动画、插值器
模板⽅法模式
1、概念
模板⽅法是通过定义⼀个算法⾻架,⽽将算法中的步骤延迟到⼦类,这样⼦类就可以复写这些步骤的实现来实现特定的算法
2、使⽤场景
多个⼦类有公有的⽅法,并且逻辑基本相同时
重要、复杂的算法,可以把核⼼算法设计为模板⽅法
重构时,模板⽅法模式是⼀个经常使⽤的模式
3、UML图分析
4、在Android中应⽤
Activity和Fragment⽣命周期、AsyncTask、BaseActivity
观察者模式
1、概念
定义对象之间的⼀种⼀对多依赖关系,使得每当⼀个对象状态发⽣改变时,其相关依赖对象皆得到通知并被⾃动更新
2、使⽤场景
⼀个抽象模型由两个⽅⾯,其中⼀个⽅⾯依赖于另⼀个⽅⾯
⼀个对象的改变将导致⼀个或多个其他对象也发⽣改变
需要在系统中创建⼀个触发链
3、UML图分析
4、在Android中应⽤
ListView、RxJava
责任链模式
1、概念
是⼀个请求有多个对象来处理,这些对象是⼀条链,但具体由哪个对象来处理,根据条件判断来确定,如果不能处理会传递给该链中的下⼀个对象,直到有对象处理它为⽌
2、使⽤场景
有多个对象可以处理同⼀个请求,具体哪个对象处理该请求待运⾏时刻再确定
在不明确指定接收者的情况下,向多个对象中的⼀个提交⼀个请求
可动态指定⼀组对象处理请求,客户端可以动态创建职责链来处理请求
3、UML图分析
4、在Android中应⽤
try-catch语句、有序⼴播、事件分发机制
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论