Maison > Java > javaDidacticiel > le corps du texte

Explication détaillée de l'implémentation Java du code de modèle de visiteur

黄舟
Libérer: 2017-03-11 11:37:23
original
1320 Les gens l'ont consulté

Explication détaillée de l'implémentation Java du code de modèle de visiteur

interface Visitor {
	void visit(Gladiolus g);

	void visit(Chrysanthemum c);
}
Copier après la connexion
// concrete visitor		名称访问
class StringVisitor implements Visitor {
	String s;

	public String toString() {
		return s;
	}

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

	public void visit(Chrysanthemum c) {
		s = "Chrysanthemum";
	}
}
Copier après la connexion
// concrete visitor		蜜蜂访问
class BeeVisitor implements Visitor {
	public void visit(Gladiolus g) {
		System.out.println("蜜蜂 来 访问 Gladiolus");
	}

	public void visit(Chrysanthemum c) {
		System.out.println("蜜蜂 来 访问 Chrysanthemum");
	}
}
Copier après la connexion
interface Flower {
	void accept(Visitor v);
}
Copier après la connexion
/*
 * concrete element		菊花
 */
class Chrysanthemum implements Flower {
	public void accept(Visitor v) {
		v.visit(this);
	}
}
Copier après la connexion
// concrete element		剑兰
class Gladiolus implements Flower {
	public void accept(Visitor v) {
		v.visit(this);
	}
}
Copier après la connexion
//这是Flower一个对象生成器
class FlowerGenerator {
	private static Random rand = new Random();

	public static Flower newFlower() {
		switch (rand.nextInt(2)) {
		default:
		case 0:
			return new Gladiolus();
		case 1:
			return new Chrysanthemum();
		}
	}
}
Copier après la connexion
/*
 * 访问者(Visitor)模式		行为型模式
 * 在不修改已有程序结构的前提下,通过添加额外的“访问者”来完成对已有代码功能的提升
 * 简单来说,访问者模式就是一种分离对象数据结构与行为的方法,通过这种分离,可达到为一个被访问者动态添加新的操作而无需做其它的修改的效果
 * 缺点:增加新的元素类,比较困难,因为需要修改抽象访问者的接口及实现,违反开-闭 原则
 */
public class Test {
	/*
	 * 首先在客户端先获得一个具体的访问者角色 遍历对象结构 对每一个元素调用accept方法,将具体访问者角色传入 这样就完成了整个过程
	 */
	public static void main(String args[]) {
		List<Flower> flowers = new ArrayList<Flower>();
		for (int i = 0; i < 10; i++)
			flowers.add(FlowerGenerator.newFlower());
		Visitor visitor = new StringVisitor();
		Iterator<Flower> iterator = flowers.iterator();
		while (iterator.hasNext()) {
			iterator.next().accept(visitor);
			System.out.println(visitor);
		}
		System.out.println("---------------");
		/*
		 * 一个新的访问行为 :BeeVisitor 蜜蜂访问
		 */
		Visitor visitor2 = new BeeVisitor();
		for (Flower flower : flowers) {
			flower.accept(visitor2);
		}

	}
}
Copier après la connexion

Imprimer

Gladiolus
Chrysanthemum
Chrysanthemum
Gladiolus
Chrysanthemum
Chrysanthemum
Chrysanthemum
Chrysanthemum
Gladiolus
Gladiolus
---------------
蜜蜂 来 访问 Gladiolus
蜜蜂 来 访问 Chrysanthemum
蜜蜂 来 访问 Chrysanthemum
蜜蜂 来 访问 Gladiolus
蜜蜂 来 访问 Chrysanthemum
蜜蜂 来 访问 Chrysanthemum
蜜蜂 来 访问 Chrysanthemum
蜜蜂 来 访问 Chrysanthemum
蜜蜂 来 访问 Gladiolus
蜜蜂 来 访问 Gladiolus
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!