Java访问者模式以及在访问者模式中使用反射

来源:互联网 发布:淘宝红线绿线流量图 编辑:程序博客网 时间:2024/05/22 14:03

设计模式复习,代码是最好的说明。

定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作,属于行为类模式。

UML:



代码:

abstract class Element{    public abstract void accept(IVisitor visitor);    public abstract void doSomething();}interface IVisitor{    public void visit(ConcreteElement1 concreteElement1);    public void visit(ConcreteElement2 concreteElement2);}class ConcreteElement1 extends Element{    public void accept(IVisitor visitor) {        visitor.visit(this);    }    public void doSomething() {        System.out.println("Element1");    }}class ConcreteElement2 extends Element{    public void accept(IVisitor visitor) {        visitor.visit(this);    }    public void doSomething() {        System.out.println("Element2");    }}class Visitor implements IVisitor{    public void visit(ConcreteElement1 concreteElement1) {        concreteElement1.doSomething();    }    public void visit(ConcreteElement2 concreteElement2) {        concreteElement2.doSomething();    }}class ObjectStruture{    public static List<Element> getList(){        List<Element> list = new ArrayList<Element>();        for (int i = 0; i <10 ; i++) {            if (new Random().nextInt(100)>50)                list.add(new ConcreteElement1());            else                list.add(new ConcreteElement2());        }        return list;    }}public class Client {        public static void main(String[] args) {        List <Element>list = ObjectStruture.getList();        IVisitor visitor = new Visitor();        for (Element element :list) {            element.accept(visitor);        }    }}

从定义和代码其实不难理解,访问者模式是就是为了解决“如何操作集合类型中不同类型的对象”这一问题。它比使用ifelse更为灵活、扩展性更好,但是也引入了循环依赖、代码增多、难以理解等问题。不过瑕不掩瑜,利用反射可以使访问者模式更加灵活高效,详见https://www.javaworld.com/article/2077602/learn-java/java-tip-98--reflect-on-the-visitor-design-pattern.html


参考链接:

http://www.importnew.com/12536.html

http://blog.csdn.net/zhengzhb/article/details/7489639


如有错误,欢迎指出!



原创粉丝点击