zoukankan      html  css  js  c++  java
  • 行为型设计模式之访问者模式(Visitor)

    结构
    意图 表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
    适用性
    • 一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。
    • 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。Vi s i t o r 使得你可以将相关的操作集中起来定义在一个类中。当该对象结构被很多应用共享时,用Vi s i t o r 模式让每个应用仅包含需要用到的操作。
    • 定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。
     1  using System;
     2 
     3     abstract class Visitor 
     4     {
     5         abstract public void VisitElementA(ConcreteElementA a);
     6         abstract public void VisitElementB(ConcreteElementB b);
     7     }
     8 
     9     class ConcreteVisitor1 : Visitor
    10     {
    11         override public void VisitElementA(ConcreteElementA a)
    12         {
    13             
    14         }
    15 
    16         override public void VisitElementB(ConcreteElementB b)
    17         {
    18             
    19         }
    20     }
    21 
    22     abstract class Element 
    23     {
    24         abstract public void Accept(Visitor v);
    25     }
    26 
    27     class ConcreteElementA : Element 
    28     {
    29         public Visitor myVisitor;
    30         override public void Accept(Visitor v)
    31         {
    32             myVisitor = v;            
    33         }
    34 
    35         public void OperationA()
    36         {
    37             
    38         }
    39 
    40         public void DoSomeWork()
    41         {
    42             // do some work here
    43             // . . .
    44 
    45             // Get visitor to visit
    46             myVisitor.VisitElementA(this);        
    47 
    48             // do some more work here
    49             // . . .
    50         }
    51     }
    52 
    53     class ConcreteElementB : Element 
    54     {
    55         override public void Accept(Visitor v)
    56         {
    57             
    58         }
    59 
    60         public void OperationB()
    61         {
    62             
    63         }
    64     }
    65 
    66     /// <summary>
    67     ///    Summary description for Client.
    68     /// </summary>
    69     public class Client
    70     {
    71         public static int Main(string[] args)
    72         {            
    73             ConcreteElementA eA = new ConcreteElementA();
    74             ConcreteElementB eB = new ConcreteElementB();
    75             ConcreteVisitor1 v1 = new ConcreteVisitor1();
    76 
    77             eA.Accept(v1);
    78             eA.DoSomeWork();
    79 
    80             return 0;
    81         }
    82     }
    访问者模式
  • 相关阅读:
    html5标签---不常用新标签的整理
    拖拽demo--兼容--全局捕获
    Linux now!--网络配置
    windows下 memcached 和 redis 服务器安装
    MySQL5.6安装步骤(windows7/8_64位)
    zend 环境
    mysql自增id超大问题查询
    烦人的运营后台导出大批量数据
    kafka环境搭建和使用(python API)
    分布式系统中zookeeper实现配置管理+集群管理
  • 原文地址:https://www.cnblogs.com/ziranquliu/p/4660402.html
Copyright © 2011-2022 走看看