访问者模式
访问者模式属于行为型设计模式
定义:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作
访问者模式就是将数据结构与数据操作相分离
模式类图
角色:
- 抽象访问者:
Visitor
- 具体访问者:
ConcreteVisitor
- 抽象元素:
Element
- 具体元素:
ConcreteElement
优点
- 符合单一职责原则,具体元素负责数据的加载,具体访问者负责操作数据
- 扩展性好,如果需要新增操作方式,只需要在具体访问者增加方法,灵活性高
缺点
- 违背了迪米特法则,访问者类需要了解元素类的内部实现
- 违背了依赖倒置转原则,应该面向接口编程而不是类
- 元素类增加元素复杂,对应的访问者类也要根据需求看看是否需要更改
模式代码实现
源码地址:https://github.com/mingyuHub/design-patterns
抽象访问者
/**
* @author: chenmingyu
* @date: 2019/3/26 20:52
* @description: 抽象访问者
*/
public interface Visitorable {
/**
* 接收元素
* @param sub
*/
void visit(Element sub);
}
具体访问者
/**
* @author: chenmingyu
* @date: 2019/3/26 20:54
* @description: 具体访问者
*/
public class ConcreteVisitor implements Visitorable {
@Override
public void visit(Element sub) {
sub.doSomething();
System.out.println("访问者学习设计模式");
}
}
抽象元素
/**
* @author: chenmingyu
* @date: 2019/3/26 20:52
* @description:
*/
public interface Element {
/**
* 接受访问者
* @param visitor
*/
void accept(Visitorable visitor);
/**
* 自定义方法
*/
void doSomething();
}
具体元素
/**
* @author: chenmingyu
* @date: 2019/3/26 20:56
* @description: 具体元素
*/
public class ConcreteElement implements Element {
@Override
public void accept(Visitorable visitor) {
visitor.visit(this);
}
@Override
public void doSomething() {
System.out.println("要不要学一会儿设计模式");
}
}
验证
public static void main(String[] args) {
Visitorable visitor = new ConcreteVisitor();
Element subject = new ConcreteElement();
subject.accept(visitor);
}
输出
要不要学一会儿设计模式
访问者学习设计模式
参考:设计模式之禅:https://www.kancloud.cn/sstd521/design/193602
推荐阅读:23种设计模式详解