访问者模式

本文通过一个具体的Java示例,展示了双重分派设计模式的应用。该模式允许基于发送消息的对象类型和接收消息的对象类型来选择方法实现。示例中定义了花的抽象接口和访问者接口,并实现了多种花的具体类及不同的访问者类。
摘要由CSDN通过智能技术生成
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;

public class Mainer {
	public static void main(String[] args) {
		List flowers = new ArrayList();
		for (int i = 0; i < 10; i++) {
			flowers.add(FlowerGenerator.newFlower());
		}
		Visitor vist = new StringVistor();
		Iterator it = flowers.iterator();
		while (it.hasNext()) {
			((Flower) it.next()).accept(vist);
			System.out.println(vist);
		}

	}
}

interface Flower {
	void accept(Visitor v);
}

interface Visitor {
	void visit(Gladiolus g);

	void visit(Runuculus r);

	void visit(Chrysanthemum c);
}

class StringVistor implements Visitor {
	String s;

	public String toString() {
		return s;
	}

	public void visit(Gladiolus g) {
		s = "Gladiolus";
	}

	public void visit(Runuculus r) {
		s = "Runuculus";
	}

	public void visit(Chrysanthemum c) {
		s = "Chrysanthemum";
	}
}

class BeeVistor implements Visitor {

	public void visit(Gladiolus g) {
		System.out.println("Bee and Gladiolus");
	}

	public void visit(Runuculus r) {
		System.out.println("Bee and Runuculus");
	}

	public void visit(Chrysanthemum c) {
		System.out.println("Bee and Chrysanthemum");
	}
}

class Gladiolus implements Flower {
	public void accept(Visitor v) {
		v.visit(this);
	}
}

class Runuculus implements Flower {
	public void accept(Visitor v) {
		v.visit(this);
	}
}

class Chrysanthemum implements Flower {
	public void accept(Visitor v) {
		v.visit(this);
	}
}

class FlowerGenerator {
	private static Random rand = new Random();

	public static Flower newFlower() {
		switch (rand.nextInt(3)) {
		default:
		case 0:
			return new Gladiolus();
		case 1:
			return new Runuculus();
		case 2:
			return new Chrysanthemum();
		}
	}
}


如何理解双重分派?
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值