解释器模式
1、解释器模式介绍
提供一种解释语言的语法或表达方式,该模式定义了一个解释器语言的语法或表达式的方式,通过该接口解释一个特定的上下文
就比如通配式A*B表示AliB这个单词的解释性语法
2、解释器模式的使用场景
当语句可以表示为一个抽象语法树时
某些特定领域出现不断重复的问题,如需要把阿拉伯数字转换成中文
3、解释器模式的组成
1、抽象表达式 声明一个抽象的解释操作父类
2、终结符表达式 实现文法中与终结符有关的解释操作
3、非终结符表达式
4、解释器模式的简单实现
算法表达式m+n+p就可以用解释器模式进行解释,m、n、p可以看作终结符号,而+可以看作成非终结符号,首先定义数字解释器、运算符号解释器都实现一个解释器接口
然后在处理操作逻辑时就可以用这些解释器进行操作,所以解释器模式本质上是将复杂的文法规则分离为简单的功能进行解释,最后将其组合成一颗抽象语法树解释执行
5、Android源码中解释器模式实现
在Andriod解析应用配置文件时用到,PackageParser类中对其每一个组件标签创建了相应的类以存储相应的信息
6、解释器模式优缺点
(1)优点:灵活的拓展性,在用到新增解释器对象进行具体解释时,非常方便
(2)缺点:每一个文法都可以对应至少一个解释器,导致后期维护困难,对复杂的文法并不推荐使用解释器模式
命令模式
1、命令模式介绍
行为型设计模式之一,我们在日常接触较多的命令模式有关机命令和开机命令,用户只需调用一个方法,其所有被封装的方法将挨个执行调用,如关机就包括结束进程,调用内核指令等操作
2、命令模式的使用场景
需要抽象出待执行动作,然后以参数的形式提供出来
在不同时刻指定、排列和执行请求
需要支持取消操作
支持修改日志操作
支持事务操作
3、命令模式的组成
(1)Receiver 接受者角色,负责具体实施一个请求
(2)Command 命令角色 定义所有命令类的抽象接口
(3)ConcreteCommand 具体命令角色
(4)Invoker 请求者角色
(5)Client
由Client的代码可弄清这些角色之间的关系
public class Client{
public static void main(String[] args){
Receiver receiver = new Receiver();
Command command =
new ConcreteCommand(receiver);
Invoker invoker = new Invoker(command);
invoker.action();
}
}
命令要和请求者绑定,那么在我们增加或修改时只用修改很少类就足够了
4、Andriod 源码中的命令模式
Andriod中的事件输入系统
实现一个简单的绘图板
5、命令模式的总结
容易导致类的膨胀,从而获得更好的拓展性
观察者模式
1、观察者模式介绍
最常用的是订阅发布系统,使观察者和被观察者之间解耦,使UI层与具体事务解耦;定义对象间一种一对多的依赖关系,使得每当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新
2、观察者模式的使用场景
关联行为场景
事件多级触发场景
跨系统的消息交换场景,如消息队列、事件总线的处理机制
3、观察者模式角色
抽象及具体主题(即被观察者)抽象及具体的观察者
4、Andriod 源码中的观察者模式
Listview中的Adapter的实现,当ListView中的数据发生改变时,调用Adapter的notifyDateSetChanged函数,这个函数又调用DateSetObservable 的notifyChanged 函数,这个函数调用所有观察者的onChanged函数,使得ListView刷新页面
Andriod中事务总线的EventBus通过tag来更新所有符合这个tag的订阅者
5、观察者模式总结
优点:观察者和被观察者之间是抽象耦和,应对业务变化,增强系统灵活性和可拓展性
缺点: 在应用观察者模式时需要考虑开发效率和运行效率问题,程序中包括一个被观察者、多个观察者、开发和调试等内容会比较复杂,通知顺序是顺序执行,一个观察者卡顿,影响整体的执行效率,在这种情况下,一般采用异步的方法