Android 内功心法(1.8)——android常用设计模式之访问者模式
2016-05-12 10:01
519 查看
访问者模式的概念:
访问者表示一个作用某个对象结构的各元素的操作。可以在不改变各个类的前提下定义作用这些元素的新操作。
目的:
把处理数据从数据结构中分离出来。有比较稳定的数据结构又有易于变化的算法。
好处:
访问者使得算法操作的增加变得简单,换句话说,就是访问者增加新操作很容易。增加一个新操作就相当于增加一个访问者,访问者模式就是一系列有关的行为集中到一个访问者对象中。
缺点:
虽然增加新操作很容易,但是增加新的数据结构变得困难。也就是说在原有的数据结构上增加新操作是很容易的,而要改变原有数据结构就变得很困难了。
先来看代码:
看代码可以看出,如果我们还要添加访问者或者被访问者(接收者)。
只需要实现访问者和被访问者抽象类。
在高级接口中我们分别添加访问者和被访问者,这样只要执行了objectStructure的accept方法,并且传入了访问者实例,所有的被访问元素都会被访问者调用到。
例如,接收者可以是女人,和男人。
访问者可以是各种状态,失恋,结婚。
当女人这个接收者被放进高级接口(ObjectStructure)中,并添加了一些列的访问者(失恋,结婚)。
最后就是在失恋中传入女人,这时候就是女人被失恋访问了。
那么这个女人的数据结构就变成了:
当女人失恋时,伤心
当女人结婚时,高兴
换句话说就是,女人访问了失恋,结果伤心。女人访问了结婚,结果高兴。
访问者也是一把双刃剑,访问者模式比较复杂但是它的能力非常大。如果不理解访问者模式,实在是不会去想用它的吧。
访问者表示一个作用某个对象结构的各元素的操作。可以在不改变各个类的前提下定义作用这些元素的新操作。
目的:
把处理数据从数据结构中分离出来。有比较稳定的数据结构又有易于变化的算法。
好处:
访问者使得算法操作的增加变得简单,换句话说,就是访问者增加新操作很容易。增加一个新操作就相当于增加一个访问者,访问者模式就是一系列有关的行为集中到一个访问者对象中。
缺点:
虽然增加新操作很容易,但是增加新的数据结构变得困难。也就是说在原有的数据结构上增加新操作是很容易的,而要改变原有数据结构就变得很困难了。
先来看代码:
/** * 访问者基本抽象类 */ public abstract class Visitor { //访问方法a public abstract void vistorA(ConcreteElementA concreteA); //访问方法b public abstract void vistorB(ConcreteElementB concreteB); }
/** * 定义一个接收抽象类,以一个访问者为参数 */ public abstract class Element { //接收者中传入访问者 public abstract void accept(Visitor visitor); }
/** * 具体访问者 */ public class ConcreteVistorA extends Visitor { @Override public void vistorA(ConcreteElementA concreteA) { //具体逻辑 Log.e("test", "concreteA" + "被" + "ConcreteVistorA" + "访问"); } @Override public void vistorB(ConcreteElementB concreteB) { //具体逻辑 Log.e("test", "concreteB" + "被" + "ConcreteVistorA" + "访问"); } }
/** * 具体接收类 */ public class ConcreteElementA extends Element { @Override public void accept(Visitor visitor) { visitor.vistorA(this); } //其他方法 public void operationA() { } }
/** * 提供一个高层的接口以允许访问者访问它的元素 */ public class ObjectStructure { private List<Element> elements = new ArrayList<>(); //添加接收者实例 public void add(Element element) { elements.add(element); } //移除接收者实例 public void remove(Element element) { if (elements.contains(element)) elements.remove(element); } //传入访问者实例,给每个接收者都添加传入的访问者实例 public void accept(Visitor visitor) { for (Element element : elements) { element.accept(visitor); } } }
//运行代码 private void test() { //实例化一个访问者可以访问它的元素的接口 ObjectStructure objectStructure = new ObjectStructure(); //添加一个接收者,例如这个接收者是个女人 objectStructure.add(new ConcreteElementA()); //实例化访问者a,那么访问者就是一种状态,例如失恋 ConcreteVistorA concreteVistorA = new ConcreteVistorA(); //实施访问 objectStructure.accept(concreteVistorA); //最后的反应,当接收者女人拥有访问者失恋的状态的时候,那么就包含了失恋和女人在一起的反应,例如,哭,伤心 //ConcreteElementA访问了ConcreteVistorA }
看代码可以看出,如果我们还要添加访问者或者被访问者(接收者)。
只需要实现访问者和被访问者抽象类。
在高级接口中我们分别添加访问者和被访问者,这样只要执行了objectStructure的accept方法,并且传入了访问者实例,所有的被访问元素都会被访问者调用到。
例如,接收者可以是女人,和男人。
访问者可以是各种状态,失恋,结婚。
当女人这个接收者被放进高级接口(ObjectStructure)中,并添加了一些列的访问者(失恋,结婚)。
最后就是在失恋中传入女人,这时候就是女人被失恋访问了。
那么这个女人的数据结构就变成了:
当女人失恋时,伤心
当女人结婚时,高兴
换句话说就是,女人访问了失恋,结果伤心。女人访问了结婚,结果高兴。
访问者也是一把双刃剑,访问者模式比较复杂但是它的能力非常大。如果不理解访问者模式,实在是不会去想用它的吧。
相关文章推荐
- android字体设置
- Android开发笔记(一百)折叠式列表
- Android中RelativeLayout和LinearLayout性能分析
- Realm for Android
- android 联系人 首字母分类 封装(更新)
- 【Android】开源项目汇总-备用
- Android 系统默认参数的修改
- Android学习笔记三: android:inputType参数类型说明
- MultiDex使用方法
- 【android】解码.9图片及xml
- 如何设置Android中TextView的行间距
- Android官方开发文档Training系列课程中文版:高效显示位图之管理位图内存
- 关于 Android 进程保活,你所需要知道的一切
- 黑马Android全套视频无加密完整版
- android设置去标题栏以及设置横竖屏方法
- Android Fragment完全解析,关于碎片你所需知道的一切
- Android设置透明、半透明等效果
- 阅读图书翻页
- Android学习笔记二:TabHost控件的使用说明收集
- android环境搭建