您的位置:首页 > 移动开发 > Android开发

Android 内功心法(1.8)——android常用设计模式之访问者模式

2016-05-12 10:01 519 查看
访问者模式的概念:

访问者表示一个作用某个对象结构的各元素的操作。可以在不改变各个类的前提下定义作用这些元素的新操作。

目的:

把处理数据从数据结构中分离出来。有比较稳定的数据结构又有易于变化的算法。

好处:

访问者使得算法操作的增加变得简单,换句话说,就是访问者增加新操作很容易。增加一个新操作就相当于增加一个访问者,访问者模式就是一系列有关的行为集中到一个访问者对象中。

缺点:

虽然增加新操作很容易,但是增加新的数据结构变得困难。也就是说在原有的数据结构上增加新操作是很容易的,而要改变原有数据结构就变得很困难了。

先来看代码:

/**
* 访问者基本抽象类
*/
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)中,并添加了一些列的访问者(失恋,结婚)。

最后就是在失恋中传入女人,这时候就是女人被失恋访问了。

那么这个女人的数据结构就变成了:

当女人失恋时,伤心

当女人结婚时,高兴

换句话说就是,女人访问了失恋,结果伤心。女人访问了结婚,结果高兴。

访问者也是一把双刃剑,访问者模式比较复杂但是它的能力非常大。如果不理解访问者模式,实在是不会去想用它的吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: