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

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

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

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


如有错误,欢迎指出!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值