zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【设计模式】访问者模式

模式设计模式 访问者
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