设计模式之访问者模式

访问者模式的概念

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

访问者模式据说是最复杂的一种行为类模式了,所以要慢慢理解。

举个栗子

访问者模式的模型图

这个图也很复杂,里面有五种角色:抽象访问者、具体访问者、抽象元素、具体元素、结构对象,还是先通过编码的方式来认识一下。

  • 抽象元素
1
2
3
4
5
6
public abstract class Element {
//业务逻辑
public abstract void method();
//访问者
public abstract void accept(Visitor visitor);
}
  • 具体元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class ConcreteElement1 extends Element {
@Override
public void method() {
//具体逻辑
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public class ConcreteElement2 extends Element {
@Override
public void method() {
//具体逻辑
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
  • 抽象访问者
1
2
3
4
public interface Visitor {
void visit(ConcreteElement1 element1);
void visit(ConcreteElement2 element2);
}
  • 具体访问者
1
2
3
4
5
6
7
8
9
10
public class ConcreteVisitor implements Visitor {
@Override
public void visit(ConcreteElement1 element1) {
element1.method();
}
@Override
public void visit(ConcreteElement2 element2) {
element2.method();
}
}
  • 结构对象
1
2
3
4
5
6
7
8
9
10
public class ObjectStruture {
public static Element createElement(){
Random random=new Random();
if (random.nextInt(100)>50){
return new ConcreteElement1();
}else {
return new ConcreteElement2();
}
}
}
  • 调用场景
1
2
3
4
5
6
7
8
public class Client {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
Element element = ObjectStruture.createElement();
element.accept(new ConcreteVisitor());
}
}
}

这就是访问者模式,它提供的是一种不破坏原有结构下实现功能增量的一种方式,结构是不能变的,但是具体的操作是可以不同的,访问者模式很好的解决了这一问题。

适用范围

访问者模式适用于一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。或者当你需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类,把将相关的操作集中起来 定义在一个类中。它是对迭代器模式的一种补充,可以遍历不同对象,执行不同操作。

优点缺点

访问者模式的优点在于内部结构和外部展示完全分离,符合单一职责原则,便于后面的扩展,灵活性好。

访问者模式的缺点在于内部细节需要暴露,而且要依赖具体实现而不是接口,不符合依赖倒置原则。另一方面,内部具体组成部分一旦需要变化也会带来很大麻烦。

注意事项

访问者模式适用于对于已有的完整的结构进行上层重构的情况,有助于我们对功能的梳理,实现集中化管理的目的。

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!