深化浅出Java的访谒者情势[Java编程]
本文“深化浅出Java的访谒者情势[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
1、引子
关于系统中一个已经完成的类层次构造,我们已经给它供应了满意需求的接口.但是面对新增添的需求,我们应当怎么做呢?假如这是为数不多的几次变更,并且你不用为了一个需求的调整而将整个类层次构造通通地改正一遍,那么直接在原有类层次构造上改正大概是个 不错 的主张.
但是常常我们碰到的倒是:这样的需求变更大概会不断的发生;更重要的是需求的任何变更大概都要让你将整个类层次构造改正个底朝天…….这种近似的操作分布在差别的类里面,不是一个好现象,我们要对这个构造重构一下了.
那么,拜候者情势大概是你很好的挑选.
2、定义与构造
拜候者情势,顾名思义利用了这个情势后便可以在不改正已有程序构造的前提下,通过增添额外的“拜候者”来完成对已有代码功效的晋升.
《计划情势》一书关于拜候者情势给出的定义为:表示一个作用于某对象构造中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.从定义可以看出构造对象是利用拜候者情势必须条件,并且这个构造对象必须存在遍历自身各个对象的办法.这便近似于java中的collection概念了.
以下是拜候者情势的构成构造:
1) 拜候者角色(Visitor):为该对象构造中具体元素角色声明一个拜候操作接口.该操作接口的名字和参数标识了发送拜候恳求给具体拜候者的具体元素角色.这样拜候者便可以通过该元素角色的特定接口直接拜候它.
2) 具体拜候者角色(Concrete Visitor):实现每个由拜候者角色(Visitor)声明的操作.
3) 元素角色(Element):定义一个Accept操作,它以一个拜候者为参数.
4) 具体元素角色(Concrete Element):实现由元素角色供应的Accept操作.
5) 对象构造角色(Object Structure):这是利用拜候者情势必备的角色.它要具有以下特点:能列举它的元素;可以供应一个高层的接口以答应该拜候者拜候它的元素;可以是一个复合(组合情势)或是一个调集,如一个列表或一个无序调集.
来张类图就可以越发清楚的看清拜候者情势的构造了.
那么像引言中假想的.我们应当做些什么才能让拜候者情势跑起来呢?首先我们要在原有的类层次构造中增添accept办法.然后将这个类层次中的类放到一个对象构造中去.这样再去成立拜候者角色……
3、举例
本人阅历实在可怜,没能找到拜候者情势在实际利用中的例子.只好借《Thinking in Patterns with java》中的讲授代码一用.我略微做了下改正.
import java.util.*;
import junit.framework.*;
//拜候者角色
interface Visitor {
void visit(Gladiolus g);
void visit(Runuculus r);
void visit(Chrysanthemum c);
}
// The Flower hierarchy cannot be changed:
//元素角色
interface Flower {
void accept(Visitor v);
}
//以下三个具体元素角色
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);}
}
// Add the ability to produce a string:
//实现的具体拜候者角色
class StringVal 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";
}
}
// Add the ability to do "Bee" activities:
//另一个具体拜候者角色
class Bee 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 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();
}
}
}
//客户 测试程序
public class BeeAndFlowers extends TestCase {
/*
在这里你能看到拜候者情势履行的流程:
首先在客户端先得到一个具体的拜候者角色
遍历对象构造
对每一个元素调用accept办法,将具体拜候者角色传入
这样就完成了整个历程
*/
//对象构造角色在这里才 组装 上
List flowers = new ArrayList();
public BeeAndFlowers() {
for(int i = 0; i < 10; i++)
flowers.add(FlowerGenerator.newFlower());
}
Visitor sval ;
public void test() {
// It’s almost as if I had a function to
// produce a Flower string representation:
//这个地方你可以改正以便利用别的一个具体拜候者角色
sval = new StringVal();
Iterator it = flowers.iterator();
while(it.hasNext()) {
((Flower)it.next()).accept(sval);
System.out.println(sval);
}
}
public static void main(String args[]) {
junit.textui.TestRunner.run(BeeAndFlowers.class);
}
}
以上是“深化浅出Java的访谒者情势[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |