21访问者模式

访问者模式  (最复杂的)

<设计模式其实很简单>笔记


①定义:

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。


②代码:
//抽象访问者,声明访问者可以访问哪些元素
public abstract class Visitor{
	public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);
	public abstract void VisitConcreteElementB(ConcreteElementA concreteElementB);
}
//具体的访问者类
public  class ConcreteVisitor extends Visitor{
	//覆盖父类的抽象方法
	@Override
	//访问构件A
	public void VisitConcreteElementA(ConcreteElementA concreteElementA){
		System.out.println(concreteElementA.getClass().getCanonicalName() + "被" + 
									this.getClass().getCanonicalName() + "访问");
	}
	@Override
	//访问构件B
	public void VisitConcreteElementB(ConcreteElementB concreteElementB){
		System.out.println(concreteElementB.getClass().getCanonicalName() + "被" + 
									this.getClass().getCanonicalName() + "访问");
	}
}
//抽象元素类
public abstract class Element{
	//抽象的接受访问方法
	public abstract void Accept(Visitor visitor);
}
//具体的元素A
public class ConcreteElementA extends Element{
	//覆盖父类抽象方法
	@Override
	//接受访问方法
	public void Accept(Visitor visitor){
		visitor.VisitConcreteElementA(this);
	}
	//操作A
	public void OperationA(){ }
}
//具体的元素B
public class ConcreteElementA extends Element{
	//覆盖父类抽象方法
	@Override
	//接受访问方法
	public void Accept(Visitor visitor){
		visitor.VisitConcreteElementB(this);
	}
	//操作B
	public void OperationA(){ }
}
//结构对象类, 对访问进行控制的管理者
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(int i = 0 ; i<elements.size() ; i++){
			(elements.get(i)).Accept(visitor);
		}
	}
}
//客户端
public static void main(String[] args){
	ObjectStructure objtStru = new ObjectStructure();
	objtStru.Attach(new ConcreteElementA());
	objtStru.Attach(new ConcreteElementB());
	ConcreteVisitor concreteVisitor = new ConcreteVisitor();
	objtStru.Accept(concreteVisitor);
}
//访问者模式适合数据结构相对稳定的系统,访问者模式的目的是将对数据的处理从数据结构中分离出来。


③适用的地方:
当一个对象结构包含有很多类对象,但是它们有不同的接口,并且开发人员希望对这些对象实施一些依赖于具体类的操作时。
当需要对一个对象结构中的对象进行很多不同的并且不相关的操作时。
当该对象结构被很多应用共享时。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值