android访问者模式,Android设计模式-访问者模式

1.定义

封装一些作用于某种数据结构中的各元素的操作,他可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

2.访问者模式UML图

4a461707fd1c

访问者模式UML图

角色介绍

Visitor 抽象访问者,抽象类或者接口,声明访问者可以访问哪些对象,具体到程序中,就是参数中到具体访问对象。所以方法个数理论上和具体对象的个数是相同的。

ConcreteVisitor 具体访问者,它决定了访问到具体类后到具体行为。

ObjectStruture 结构对象,一般容纳在多个不同类、不同接口的容器,如list,set,map等,在项目中,很少抽象出这个角色

Element 抽象元素,声明接受哪一类访问者来访问,通过accept方法参数来定义。

ConcreteElement 具体元素,实现accept方法,一般都是accept中vi sitor.visit(this)。

3.简单实现

3.1 抽象访问者

public abstract class Visitor {

public abstract void visit(ConcreteElement1 concreteElement1);

public abstract void visit(ConcreteElement2 concreteElement2);

}

3.2具体访问者

public class ConcreteVisitor extends Visitor {

@Override

public void visit(ConcreteElement1 concreteElement1) {

concreteElement1.doSomething();

}

@Override

public void visit(ConcreteElement2 concreteElement2) {

concreteElement2.doSomething();

}

}

3.3抽象元素

public abstract class Element {

public abstract void doSomething();

public abstract void accept(Visitor visitor);

}

3.4具体元素

public class ConcreteElement1 extends Element {

@Override

public void doSomething() {

System.out.println("ConcreteElement1的方法doSomething");

}

@Override

public void accept(Visitor visitor) {

visitor.visit(this);

}

}

public class ConcreteElement2 extends Element {

@Override

public void doSomething() {

System.out.println("ConcreteElement2的方法doSomething");

}

@Override

public void accept(Visitor visitor) {

visitor.visit(this);

}

}

3.5结构对象

public class ObjectStruture {

public static Element createElement(){

Random random=new Random();

if (random.nextBoolean()){

return new ConcreteElement1();

}else {

return new ConcreteElement2();

}

}

}

3.6客户端调用

public class MyClass {

public static void main(String args[]) {

for (int i = 0; i < 10; i++) {

Element element= ObjectStruture.createElement();

element.accept(new ConcreteVisitor());

}

}

}

打印结果

ConcreteElement1的方法doSomething

ConcreteElement1的方法doSomething

ConcreteElement1的方法doSomething

ConcreteElement1的方法doSomething

ConcreteElement2的方法doSomething

ConcreteElement2的方法doSomething

ConcreteElement1的方法doSomething

ConcreteElement2的方法doSomething

ConcreteElement1的方法doSomething

ConcreteElement1的方法doSomething

上述例子为通用的简单实现,当在添加不同的访问者的时候,可以通过添加具体访问者,然后通过accept方法传入进去,这样在不同的具体访问者中,可以调用具体元素的不同方法(上述例子只声明了一个具体访问者,并且具体元素中也只有一个dosomething方法)

4.总结

使用场景

对象结构比较稳定,但经常在此对象结构上定义新的操作

需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免这些操作“污染”这些对象的类直接在类中进行修改。也不希望在增加新操作的时候修改这些类。

优点

各角色职责分离,符合单一职责原则

具有优秀的扩展性

使得数据结构和作用于结构上的操作解耦,使得操作集合可以独立变化。

缺点

具体元素对访问者暴露,违反了迪米特原则

具体元素变更对时候修改成本略大

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值