visitor设计模式

visitor设计模式

对外部提供访问ADT的方式,灵活扩展ADT的方法

类结构

  • 一个抽象接口
  • 多个具体实现类
  • 一个抽象访问者
  • 多个具体访问者

目标:给具体实现类灵活扩展方法

抽象接口

// Element.java
// 面向接口编程
public interface Element {
	// some methods
	//...
	
	// 提供accept接口
	void accept(Visitor visitor);
}

具体实现类A

// ConcreteElementA.java
public class ConcreteElementA implements Element {
	// override some methods
	// ...
	
	@Override
	public void accept(Visitor visitor) {
		visitor.visit(this);
	}
}

具体实现类B

// ConcreteElementB.java
public class ConcreteElementB implements Element {
	// override some methods
	// ...
	
	@Override
	public void accept(Visitor visitor) {
		visitor.visit(this);
	}
}

抽象访问者

// Visitor.java
public interface Visitor {
	void visit(ConcreteElementA element);
	void visit(ConcreteElementB element);
}

具体访问者1

// ConcreteVisitor1.java
public class ConcreteVisitor1 implements Visitor {
	@Override
	public void visit(ConcreteElementA a) {
		System.out.println("a1");
	}

	@Override
	public void visit(ConcreteElementB b) {
		System.out.println("b1");
	}
}

具体访问者2

// ConcreteVisitor2.java
public class ConcreteVisitor2 implements Visitor {
	@Override
	public void visit(ConcreteElementA a) {
		System.out.println("a2");
	}

	@Override
	public void visit(ConcreteElementB b) {
		System.out.println("b2");
	}
}

客户端

// Client.java
public static void main(String[] args) {
	Visitor visitor1 = new ConcreteVisitor1();
	Visitor visitor2 = new ConcreteVisitor2();
	Element a = new ConcreteElementA();
	Element b = new ConcreteElementB();
	a.accept(visitor1);
	a.accept(visitor2);
	b.accept(visitor1);
	b.accept(visitor2);
}
// in terminal
// a1
// a2
// b1
// b2

通过传入不同的ConcreteVisitor,可为a, b扩展不同的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值