大话设计模式之访问者模式

访问者模式:
表示一个 作用于 某对象结构中的各元素的操作,它可以是你在 不改变
各元素的类的前提下定义 作用于这些元素的新操作。
访问模式适用于:数据结构相对稳定的系统。
他把数据结构和作用于结构上的操作直接的耦合解脱开,使得操作集合可以相对自由地 演化。
访问者的目的是要把处理 从数据结构分离出来。
访问者模式 得优点就是增加新得操作很容易,因为增加新得操作 就意味着增加 一个新得访问者,
访问者模式 将有关得行为集中到 一个访问者对象中。同时,访问者得缺点就是 使增加新得数据
结构变得困难了。(只有真的需要了才会用)

/**
 * 定义一个 Accept 操作,它以一个访问者为参数
 * */
abstract class Element {
	public abstract void Accept(Visitor visitor);

}
/**
 * 具体元素,实现Accept操作
 * */
public class ConcreteElementA extends Element{

	@Override
	public void Accept(Visitor visitor) {
		visitor.VisitConcreteElementA(this);
	}
//	其他相关得方法
	public void operationA() {}
}
/**
 * 具体元素,实现Accept操作
 * */
public class ConcreteElementB extends Element{

	@Override
	public void Accept(Visitor visitor) {
		visitor.VisitConcreteElementB(this);
	}
// 其他得相关方法
	public void operationB() {}
}
/**
 * 为该对象结构 种 ConcreteElement 的每一个类声明一个Visit 操作。
 * */
abstract class Visitor {

	public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);
	
	public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB);
}
/**
 * 具体访问者,实现每个 有 Visitor 声明得操作,每个操作实现算法得一部分,而该算法 片段
 * 乃是 对 结构种对象得类
 * **/
public class ConcreteVisitorA extends Visitor{

	@Override
	public void VisitConcreteElementA(ConcreteElementA concreteElementA) {
		// TODO Auto-generated method stub
		System.out.println("beifangwenA");
	}

	@Override
	public void VisitConcreteElementB(ConcreteElementB concreteElementB) {
		// TODO Auto-generated method stub
		System.out.println("beifangwenB");
	}

}
/**
 * 具体访问者,实现每个 有 Visitor 声明得操作,每个操作实现算法得一部分,而该算法 片段
 * 乃是 对 结构种对象得类
 * **/
public class ConcreteVisitorB extends Visitor{

	@Override
	public void VisitConcreteElementA(ConcreteElementA concreteElementA) {
		// TODO Auto-generated method stub
		System.out.println("beifangwenA");
	}

	@Override
	public void VisitConcreteElementB(ConcreteElementB concreteElementB) {
		// TODO Auto-generated method stub
		System.out.println("beifangwenB");
	}

}
/**
 * 能枚举它得元素。可以提供一个高层得接口允许访问者访问它得元素
 * */

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ObjectStructure {

	private List<Element> list=new ArrayList<>();
	public void attach(Element element) {
		list.add(element);
	}
	public void delete(Element element) {
		list.remove(element);
	}
	public void accept(Visitor visitor) {
		for (Element element : list) {
			element.Accept(visitor);
		}
	}
}
/**
 * 客户端
 * */
public class Test1 {
public static void main(String[] args) {
	ObjectStructure objectStructure = new ObjectStructure();
	objectStructure.attach(new ConcreteElementA());
	objectStructure.attach(new ConcreteElementB());
	
	ConcreteVisitorA concreteVisitorA = new ConcreteVisitorA();
	ConcreteVisitorB concreteVisitorB = new ConcreteVisitorB();
	
	objectStructure.accept(concreteVisitorB);
	objectStructure.accept(concreteVisitorA);
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值