zoukankan      html  css  js  c++  java
  • 访问者模式(Visitor、Element、accept、ObjectStructure、)(操作外置,与数据结构分离)

    访问者模式表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作
    从定义可以看出结构对象是使用访问者模式的必备条件,而且这个结构对象必须存在遍历自身各个对象的方法,类似于Java中的Collection。

    访问者模式的目的是要把处理从数据结构中分离出来,如果系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式是个不错的选择,因为访问者模式使的算法操作的增加变得容易。相反,如果系统的数据结构不稳定,易于变化,则此系统就不适合使用访问者模式了。

    类图:



    访问者模式结构:
    访问者角色(Visitor): 为该对象结构中具体元素角色声明一个访问操作接口.
    具体访问者角色(Concrete Visitor): 实现每个由访问者角色(Visitor)声明的操作.
    元素角色(Element): 定义一个Accept操作,它以一个访问者为参数.
    具体元素角色(Concrete Element): 实现由元素角色提供的Accept操作.
    对象结构角色(Object Structure): 这是使用访问者模式必备的角色. 它要具备以下特征: 能枚举它的元素; 可以提供一个高层的接口以允许该访问者访问它的元素; 可以是一个复合(组合模式)或是一个集合, 如一个列表或一个无序集合.

    实例:
    public interface Visitor
    {
        public void visit(GladiolusConcreteElement gladiolus);

        public void visit(ChrysanthemumConreteElement chrysanthemum);
    }

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

    public class GladiolusConcreteElement implements FlowerElement
    {
        @Override
        public void accept(final Visitor visitor)
        {
            visitor.visit(this);
        }
    }

    public class ChrysanthemumConreteElement implements FlowerElement
    {
        @Override
        public void accept(final Visitor visitor)
        {
            visitor.visit(this);
        }
    }

    public class GladiolusVisitor implements Visitor
    {
        @Override
        public void visit(final GladiolusConcreteElement gladiolus)
        {
            System.out.println(this.getClass().getSimpleName() + " access " + gladiolus.getClass().getSimpleName());
        }

        @Override
        public void visit(final ChrysanthemumConreteElement chrysanthemum)
        {
            System.out.println(this.getClass().getSimpleName() + " access " + chrysanthemum.getClass().getSimpleName());
        }

    }

    public class ChrysanthemumConreteElement implements FlowerElement
    {
        @Override
        public void accept(final Visitor visitor)
        {
            visitor.visit(this);
        }
    }

    public class ObjectStructure
    {
        private final List<FlowerElement> elements = new ArrayList<FlowerElement>();

        public void addElement(final FlowerElement e)
        {
            elements.add(e);
        }

        public void removeElement(final FlowerElement e)
        {
            elements.remove(e);
        }

        public void accept(final Visitor visitor)
        {
            for (final FlowerElement e : elements)
            {
                e.accept(visitor);
            }
        }
    }

    public class Client
    {
        public static void main(final String[] args)
        {
            final ObjectStructure os = new ObjectStructure();
            os.addElement(new GladiolusConcreteElement());
            os.addElement(new ChrysanthemumConreteElement());

            final GladiolusVisitor gVisitor = new GladiolusVisitor();
            final ChrysanthemumVisitor chVisitor = new ChrysanthemumVisitor();

            os.accept(gVisitor);
            os.accept(chVisitor);

        }

    }

    运行结果:
    GladiolusVisitor access GladiolusConcreteElement
    GladiolusVisitor access ChrysanthemumConreteElement
    ChrysanthemumVisitor access GladiolusConcreteElement
    ChrysanthemumVisitor access ChrysanthemumConreteElement

  • 相关阅读:
    系统架构设计(通用型)
    主流Java数据库连接池分析(C3P0,DBCP,TomcatPool,BoneCP,Druid)
    JS实现多行文本最后是省略号紧随其后还有个超链接在同一行的需求
    java判断集合是否相等
    JavaScript调试技巧
    linux下出现ping:unknown host www.baidu.com问题时的解决办法——ubuntu下局域网络的配置
    linux网络配置相关命令、虚拟网络接口eth0:0
    网络游戏服务器架构设计
    Linux 下使用静态google protocl buffer
    php-fpm nginx 使用 curl 请求 https 出现 502 错误
  • 原文地址:https://www.cnblogs.com/the-wang/p/7327446.html
Copyright © 2011-2022 走看看