您的位置:首页 > 其它

设计模式学习19 Visitor

2010-07-24 19:51 155 查看

应用场景:

在软件构建过程中,由于需求的变化,某些类层次常常需要新增加新的行为,如果直接改变基类的方法的话,将给子类的维护带来巨大的灾难。解决的思路是使用visitor模式,需要新增加方法的类是不需要改动的,只要实现相应的接口即可。这里是英文解释:

Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.



实现代码:

class Program
    {
        private ShapeVisitor  visitor;

        public Program(ShapeVisitor visitor)
        {
            this.visitor = visitor;
        }

        public void Process(Shape shape)
        {
            shape.Accept(visitor);
        }

        static void Main(string[] args)
        {
            Program program = new Program(new MyVisitor());

            // 两次的多态辨析
            // 主对象:Accept方法的调用对象
            // accept方法的参数visitor的多态辨析
            program.Process(new Line());
        }
    }

    public abstract class ShapeVisitor
    {
        // 重载,接受的参数是具体类型。

        // 如果新的功能增加的话,这个类还是需要新增加类型。

        public abstract void Visit(Rectangle rect); 
        public abstract void Visit(Circle circle);
        public abstract void Visit(Line line);
    }

    public abstract class Shape
    {
        public abstract void Draw();

        // 现在需要新增加一个函数(功能)
        // 所有的子类都需要修改,否则子类是无法编译通过的。
        public abstract void MoveTo(int posititon);

        // 将来可能会引入新的操作
        public abstract void Accept(ShapeVisitor v);

    }

    class Context
    {

    }

    public class Rectangle : Shape
    {

        public override void Draw()
        {
            throw new NotImplementedException();
        }

        public override void MoveTo(int posititon)
        {
            throw new NotImplementedException();
        }

        public override void Accept(ShapeVisitor v)
        {
            v.Visit(this);
        }
    }

    public class Circle : Shape
    {
        public override void  Draw()
        {
 	        throw new NotImplementedException();
        }

        public override void  MoveTo(int posititon)
        {
 	        throw new NotImplementedException();
        }

        public override void Accept(ShapeVisitor v)
        {
            throw new NotImplementedException();
        }
    }

    public class Line : Shape
    {

        public override void Draw()
        {
            throw new NotImplementedException();
        }

        public override void MoveTo(int posititon)
        {
            throw new NotImplementedException();
        }

        public override void Accept(ShapeVisitor v)
        {
            Console.WriteLine("public override void Accept(ShapeVisitor v)");

            v.Visit(this);
        }
    }
class MyVisitor :ShapeVisitor
    {

        public override void Visit(Rectangle rect)
        {
            // 增加对 rectangle的操作
            Console.WriteLine("这里是读rectangle类新增加的操作。");
        }

        public override void Visit(Circle circle)
        {
            
        }

        public override void Visit(Line line)
        {
            Console.WriteLine("这里是读line类新增加的操作。");
        }
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: