《大话设计模式--访问者模式》笔记

1、访问者模式(Visitor),表示一个作用于某对象结构中的各个元素的操作。它使你可以在不改变各个元素的类的前提下定义作用于这些元素的新操作。

2、 访问者模式结构图
在这里插入图片描述
2.1访问者模式适用于数据结构相对稳定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集可以相对自由的演化。
2.2访问者模式的目的是要把处理从数据结构中分离出来,如果系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法的增加变得容易。
2.3访问者的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者中。

3、基本代码实现
Visitor类,为该对象结构中ConcreteElement的每一个类声明一个visit操作。

public abstract class Visitor {

	public abstract void visitConcreteElementA(ConcreteElementA concreteElementA);
	public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);
	
}

Concretevisi1和Concretevisi2类,具体访问者,实现每个由Visitor声明的操作。每个操作实现算法的一部分,而该算法片段乃是对应于结构中对象的类。


    public class ConcreteVisitor1 extends Visitor {

	@Override
	public void visitConcreteElementA(ConcreteElementA concreteElementA) {
		// TODO Auto-generated method stub
		System.out.println(concreteElementA.getClass().getSimpleName()+"被"+this.getClass().getSimpleName()+"访问");
	}

	@Override
	public void visitConcreteElementB(ConcreteElementB concreteElementB) {
		// TODO Auto-generated method stub
		System.out.println(concreteElementB.getClass().getSimpleName()+"被"+this.getClass().getSimpleName()+"访问");
	}

	

}


public class ConcreteVisitor2 extends Visitor {
	@Override
	public void visitConcreteElementA(ConcreteElementA concreteElementA) {
		// TODO Auto-generated method stub
		System.out.println(concreteElementA.getClass().getSimpleName()+"被"+this.getClass().getSimpleName()+"访问");
	}

	@Override
	public void visitConcreteElementB(ConcreteElementB concreteElementB) {
		// TODO Auto-generated method stub
		System.out.println(concreteElementB.getClass().getSimpleName()+"被"+this.getClass().getSimpleName()+"访问");
	}
}

Element类,定义一个accept操作,它以一个访问者为参数。

public abstract class Element {

	public abstract void accept(Visitor visitor);
}

ConcreteElementA和ConcreteElementB,具体元素,实现accept操作。

public class ConcreteElementA  extends Element{

	//充分利用双派技术,实现处理与数据结构的分离
	@Override
	public void accept(Visitor visitor) {
		// TODO Auto-generated method stub
		visitor.visitConcreteElementA(this);
	}

	//其他相关方法
	public void Operation() {
		
	}
	
}

public class ConcreteElementB extends Element {

	//充分利用双派技术,实现处理与数据结构的分离
		@Override
		public void accept(Visitor visitor) {
			// TODO Auto-generated method stub
			visitor.visitConcreteElementB(this);
		}

		//其他相关方法
		public void Operation() {
			
		}
		
}

objectStructure类,能枚举它的元素,可以提供一个高层接口以允许访问者访问它的元素。

public class ObjectStructure  {
	
	private List<Element> elements=new ArrayList<Element>();
	
	public void attach(Element element) {
		elements.add(element);
	}
	
	public void detach(Element element) {
		elements.remove(element);
	}
	
	public void accept(Visitor visitor) {
		
		for (Element element : elements) {
			
			element.accept(visitor);
		}
	}
	
	
	

}

客户端代码

public class Client {

	public static void main(String[] args) {
		ObjectStructure o=new ObjectStructure();
		o.attach(new ConcreteElementA());
		o.attach(new ConcreteElementB());
		
		ConcreteVisitor1 v1=new ConcreteVisitor1();
		ConcreteVisitor2 v2=new ConcreteVisitor2();
		
		o.accept(v1);
		o.accept(v2);
		
	}
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值