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

    Visitor 访问者模式(行为型模式)

    动机(Motivation)在软件构造过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的修改,将会给子类带来繁重的变更负担,甚至破坏原有设计。

    如果在不变更类层次结构的前提下,在运行时更加需要透明地为类层次结构上的各个类活动添加新的操作,从而避免上述问题?

    意图(Intent)

    表示一个作用于某种对象结构中各元素的操作。它可以在不改变各元素的类的前提下定义作用于这些元素的新操作。——《设计模式》GoF

    示例代码

        public abstract class Shape
        {
            public abstract void Draw();
            //问题:由于Shape中新增了MoveTo方法,其各个子类将不得不随之改变
            public abstract void MoveTo(Point point);
        }
    
        public class Rectangle : Shape
        {
            public override void Draw()
            {
                //...
            }
        }
    
        public class Circle : Shape
        {
            public override void Draw()
            {
                //...
            }
        }
    
        public class Line : Shape
        {
            public override void Draw()
            {
                //...
            }
        }

     为了不改变各子类:

        public abstract class Shape
        {
            public abstract void Draw();
    
            //预料到将来肯能会引入新的操作
            public abstract void Accept(ShapeVisitor visitor);
        }
    
        public abstract class ShapeVisitor
        {
            public abstract void Visit(Rectangle shape);
            public abstract void Visit(Circle shape);
            public abstract void Visit(Line shape);
        }
    
        public class MyVisitor : ShapeVisitor
        {
            public override void Visit(Rectangle shape)
            {
                //增加对Rectangle的操作
            }
    
            public override void Visit(Circle shape)
            {
                //增加对Circle的操作
            }
    
            public override void Visit(Line shape)
            {
                //增加对Line的操作
            }
        }
    
    
        public class Rectangle : Shape
        {
            public override void Draw()
            {
                //...
            }
    
            public override void Accept(ShapeVisitor visitor)
            {
                visitor.Visit(this);//调用Visit(Rectangle shape)
            }
        }
    
        public class Circle : Shape
        {
            public override void Draw()
            {
                //...
            }
    
            public override void Accept(ShapeVisitor visitor)
            {
                visitor.Visit(this);//调用Visit(Circle shape)
            }
        }
    
        public class Line : Shape
        {
            public override void Draw()
            {
                //...
            }
    
            public override void Accept(ShapeVisitor visitor)
            {
                visitor.Visit(this);//调用Visit(Line shape)
            }
        }

    客户端调用:

            static void Main(string[] args)
            {
                ShapeVisitor visitor=new MyVisitor();
    Line line
    =new Line(); line.Accept(visitor); Rectangle rectangle=new Rectangle(); rectangle.Accept(visitor); }

    结构(Structure)

    Visitor模式的几个要点

    • Visitor模式通过对所谓双重分发(double dispatch)来实现在不更改Element层次结构的前提下,在运行时透明地为类层次结构上的各个类动态添加新的操作。
    • 所谓双重分发即Visitor模式中间包括了两个多态分发(注意其中的多态机制);第一个为Accept方法的多态辨析;第二个为Visit方法的多态辨析。
    • Visitor模式的最大缺点在于扩展类层次结构(增加新的Element子类),会导致Visitor类的改变。因此Visitor模式适用于“Element类层次结构稳定,而其中操作却经常面临频繁改动”。

    转载请注明出处:

    作者:JesseLZJ
    出处:http://jesselzj.cnblogs.com

  • 相关阅读:
    GIS的核心价值——服务
    Arcgis Add-In开发入门实例
    Arcgis for Androd API开发系列教程(一)——地图显示与GPS定位
    Spring
    字体大小对照换算表
    属性和字段的区别
    sqlDataAdapter和SqlCommand的区别
    C# 连接SQL Server数据库的几种方式--server+data source等方式
    c# using的作用
    random
  • 原文地址:https://www.cnblogs.com/jesselzj/p/4776026.html
Copyright © 2011-2022 走看看