• 技术文章 >Java >java教程

    Java实现访问者(Visitor)模式代码详解

    黄舟黄舟2017-03-11 11:37:23原创537
    Java实现访问者(Visitor)模式代码详解

    interface Visitor {
    	void visit(Gladiolus g);
    
    	void visit(Chrysanthemum c);
    }
    // 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";
    	}
    }
    // concrete visitor		蜜蜂访问
    class BeeVisitor implements Visitor {
    	public void visit(Gladiolus g) {
    		System.out.println("蜜蜂 来 访问 Gladiolus");
    	}
    
    	public void visit(Chrysanthemum c) {
    		System.out.println("蜜蜂 来 访问 Chrysanthemum");
    	}
    }
    interface Flower {
    	void accept(Visitor v);
    }
    /*
     * concrete element		菊花
     */
    class Chrysanthemum implements Flower {
    	public void accept(Visitor v) {
    		v.visit(this);
    	}
    }
    // concrete element		剑兰
    class Gladiolus implements Flower {
    	public void accept(Visitor v) {
    		v.visit(this);
    	}
    }
    //这是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();
    		}
    	}
    }
    /*
     * 访问者(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);
    		}
    
    	}
    }

    打印

    Gladiolus
    Chrysanthemum
    Chrysanthemum
    Gladiolus
    Chrysanthemum
    Chrysanthemum
    Chrysanthemum
    Chrysanthemum
    Gladiolus
    Gladiolus
    ---------------
    蜜蜂 来 访问 Gladiolus
    蜜蜂 来 访问 Chrysanthemum
    蜜蜂 来 访问 Chrysanthemum
    蜜蜂 来 访问 Gladiolus
    蜜蜂 来 访问 Chrysanthemum
    蜜蜂 来 访问 Chrysanthemum
    蜜蜂 来 访问 Chrysanthemum
    蜜蜂 来 访问 Chrysanthemum
    蜜蜂 来 访问 Gladiolus
    蜜蜂 来 访问 Gladiolus

    以上就是Java实现访问者(Visitor)模式代码详解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    上一篇:Java实现状态(State)模式的示例 下一篇:Java实现中介者(Mediator)模式的代码具体介绍
    大前端线上培训班

    相关文章推荐

    • 理解java8中java.util.function.*pojo反射新方法(附代码)• 浅析安卓app和微信授权登录及分享完整对接(代码分享)• 教你一招搞定时序数据库在Spring Boot中的使用• 一招教你使用java快速创建Map(代码分享)• PlayFramework 完整实现一个APP(十一)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网