当前位置:天才代写 > tutorial > JAVA 教程 > Java设计模式之Visitor模式

Java设计模式之Visitor模式

2017-11-11 08:00 星期六 所属: JAVA 教程 浏览:468

副标题#e#

Visitor界说

浸染于某个工具群中各个工具的操纵。它可以使你在不改变这些工具自己的环境下,界说浸染于这些工具的新操纵。

在Java中,Visitor模式实际上是疏散了collection布局中的元素和对这些元素举办操纵的行为。

为何利用Visitor?

Java的Collection(包罗Vector和Hashtable)是我们最常常利用的技能,但是Collection好象是个玄色大染缸,原来有各类光鲜范例特征的工具一旦放入后,再取出时,这些范例就消失了。那么我们势须要用If来判定,如:

Iterator iterator = collection.iterator()
while (iterator.hasNext()) {
   Object o = iterator.next();
   if (o instanceof Collection)
      messyPrintCollection((Collection)o);
   else if (o instanceof String)
      System.out.println("'"+o.toString()+"'");
   else if (o instanceof Float)
      System.out.println(o.toString()+"f");
   else
      System.out.println(o.toString());
}

在上例中,我们利用了 instanceof来判定 o的范例。

很显然,这样做的缺点代码If else if 很繁琐。我们就可以利用Visitor模式办理它。

如何利用Visitor?/

针对上例,我们设计一个接口visitor会见者:

public interface Visitor
{
   public void visitCollection(Collection collection);
   public void visitString(String string);
   public void visitFloat(Float float);
}

在这个接口中,将我们认为Collection有大概的类的范例放入个中。

有了会见者,我们需要被会见者,被会见者就是我们Collection的每个元素Element,我们要为这些Element界说一个可以接管会见的接口(会见和被会见是互动的,只有会见者,被会见者假如暗示不接待,会见者就不能会见)。

我们界说这个接口叫Visitable,用来界说一个Accept操纵,也就是说让Collection每个元素具备可会见性。

public interface Visitable
{
   public void accept(Visitor visitor);
}

好了,有了两个接口,我们就要界说他们的详细实现(Concrete class):

public class ConcreteElement implements Visitable
{
   private String value;
   public ConcreteElement(String string) {
      value = string;
   }
   //界说accept的详细内容 这里是很简朴的一句挪用
   public void accept(Visitor visitor) {
      visitor.visitString(this);
   }
}


#p#副标题#e#

再看看会见者的Concrete实现:

public class ConcreteVisitor implements Visitor
{
   //在本要领中,我们实现了对Collection的元素的乐成会见
   public void visitCollection(Collection collection) {
      Iterator iterator = collection.iterator()
      while (iterator.hasNext()) {
         Object o = iterator.next();
         if (o instanceof Visitable)
            ((Visitable)o).accept(this);
      }
   public void visitString(String string) {
      System.out.println("'"+string+"'");
   }
   public void visitFloat(Float float) {
      System.out.println(float.toString()+"f");
   }
}

在上面的visitCollection我们实现了对Collection每个元素会见,只利用了一个判定语句,只要判定其是否可以会见。

至此,我们完成了Visitor模式根基架构。

利用Visitor模式的前提

工具群布局中(Collection) 中的工具范例很少改变,也就是说会见者的身份范例很少改变,如上面中Visitor中的范例很少改变,假如需要增加新的操纵,好比上例中我们在ConcreteElement详细实现外,还需要新的ConcreteElement2 ConcreteElement3。

可见利用Visitor模式是有前提的,在两个接口Visitor和Visitable中,确保Visitor很少变革,变革的是Visitable,这样利用Visitor最利便。

假如Visitor也常常变革, 也就是说,工具群中的工具范例常常改变,一般发起是,不如在这些工具类中逐个界说操纵。可是Java的Reflect技能办理了这个问题。

Reflect技能是在运行期间动态获取工具范例和要领的一种技能。

 

    关键字:

天才代写-代写联系方式