【设计模式】访问者模式
2023-09-11 14:20:52 时间
1 简介
访问者模式(Visitor Pattern)定义:表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下,定义作用于这些元素的新操作。
访问者模式对“开闭原则”的支持存在倾斜性,增加新的访问者方便,但是增加新的元素很麻烦。
2 代码
(1)抽象访问者(Visitor)
public abstract class Visitor {
protected String name;
Visitor(String name){
this.name=name;
}
public abstract void visit(ElementA elementA);
public abstract void visit(ElementB elementB);
}
(2)具体访问者(Visitor1、Visitor2)
public class Visitor1 extends Visitor{
Visitor1(String name) {
super(name);
}
@Override
public void visit(ElementA elementA) {
System.out.println(name+" 访问了 "+elementA.name);
}
@Override
public void visit(ElementB elementB) {
System.out.println(name+" 访问了 "+elementB.name);
}
}
public class Visitor2 extends Visitor{
Visitor2(String name) {
super(name);
}
@Override
public void visit(ElementA elementA) {
System.out.println(name+" 访问了 "+elementA.name);
}
@Override
public void visit(ElementB elementB) {
System.out.println(name+" 访问了 "+elementB.name);
}
}
(3)抽象元素(Element)
public abstract class Element {
protected String name;
Element(String name){
this.name=name;
}
public abstract void accept(Visitor visitor);
}
(4)具体元素(ElementA、ElementB)
public class ElementA extends Element{
ElementA(String name) {
super(name);
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public class ElementB extends Element{
ElementB(String name) {
super(name);
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
(5)对象结构(ObjectStructure)
import java.util.ArrayList;
import java.util.Iterator;
public class ObjectStructure {
private ArrayList<Element> list=new ArrayList();
public void accept(Visitor visitor) {
Iterator iter=list.iterator();
while(iter.hasNext()) {
Element element=(Element) iter.next();
element.accept(visitor);
}
}
public void addElement(Element e) {
list.add(e);
}
public void removeElement(Element e) {
list.remove(e);
}
}
(6)客户端(Client)
public class Client {
public static void main(String[] args) {
ObjectStructure objectStructure=new ObjectStructure();
Element elementA=new ElementA("元素A");
Element elementB=new ElementA("元素B");
objectStructure.addElement(elementA);
objectStructure.addElement(elementB);
objectStructure.accept(new Visitor1("访问者1"));
System.out.println("--------------------");
objectStructure.accept(new Visitor2("访问者2"));
}
}
访问者1 访问了 元素A
访问者1 访问了 元素B
--------------------
访问者2 访问了 元素A
访问者2 访问了 元素B
相关文章
- 设计模式-外观模式
- 设计模式复习-解释器模式
- 设计模式复习-中介者模式
- 设计模式复习-职责链模式
- 设计模式-职责链模式
- WPS文字如何退出修订模式?
- 分组密码与模式
- Java描述设计模式(23):访问者模式
- 【23种设计模式】访问者模式(Visitor Pattern) .Net Core实现
- 【23种设计模式】原型模式(Prototype Pattern) .Net Core实现
- 【23种设计模式】适配器模式(Adapter Pattern) .Net Core实现
- 【设计模式】装饰模式
- 《大数据系统构建:可扩展实时数据系统构建原理与最佳实践》一2.3 图模式
- 《 测试反模式:有效规避常见的92种测试陷阱》——1.8 陷阱描述
- 智能家居发展的两种主要模式
- Java设计模式之行为型:状态模式
- 深入Java设计模式之访问者模式
- 中介者模式
- 【STM32基础学习】八种GPIO模式总结
- 《Java设计模式》之模板方法模式
- 虚拟运营商三种合作模式的对比和分析
- 设计模式 ( 十八 ):State状态模式 -- 行为型
- 设计模式(三): FACTORY工厂模式 -- 创建型模式
- 23种设计模式之访问者模式(Visitor)