避免
instanceof在基类中(不 使用 诸如
performActionor
的非描述性名称
doWhatYouAreSupposedToDo)发明任何新的人工方法的一种优雅方法是 使用
访问者模式。这是一个例子:
动物
import java.util.*;abstract class Animal { String name; public Animal(String name) { this.name = name; } public abstract void accept(AnimalVisitor av); // <-- Open up for visitors.}
狮子 和 鹿
class Lion extends Animal { public Lion(String name) { super(name); } public void roar() { System.out.println("Roar"); } public void accept(AnimalVisitor av) { av.visit(this); // <-- Accept and call visit. }}class Deer extends Animal { public Deer(String name) { super(name); } public void runAway() { System.out.println("Running..."); } public void accept(AnimalVisitor av) { av.visit(this); // <-- Accept and call visit. }}
游客
interface AnimalVisitor { void visit(Lion l); void visit(Deer d);}class ActionVisitor implements AnimalVisitor { public void visit(Deer d) { d.runAway(); } public void visit(Lion l) { l.roar(); }}
测试动物
public class TestAnimals { public static void main(String[] args) { Animal lion = new Lion("Geo"); Animal deer1 = new Deer("D1"); Animal deer2 = new Deer("D2"); List<Animal> li = new ArrayList<Animal>(); li.add(lion); li.add(deer1); li.add(deer2); for (Animal a : li) a.accept(new ActionVisitor()); // <-- Accept / visit. }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)