1 Articles, Search Results for 'Visitor Pattern'

  1. 2007/11/06 Visitor Pattern by 나는산

Visitor Pattern

2007/11/06 09:53 / Programming/Design

Visitor Design Pattern은 객체 구조에서 알고리즘을 분리하는 방법을 제공한다. 이 분리 방법은 실제적으로 객체 구조를 변경하지 않고 객체 구조에 새로운 작업을 추가하는 능력의 결과를 가져온다.

using System;
using System.Collections.Generic;
using System.Text;

namespace VistorPatternExample
{
    public interface IVisitor
    {
        void visit(Wheel wheel);
        void visit(Engine engine);
        void visit(Body body);
        void visit(Car car);
    }

    public interface IVisitable
    {
        void accept(IVisitor visitor);
    }

    public class Wheel : IVisitable
    {
        private string _Name;

        public string Name
        {
            get
            {
                return this._Name;
            }
        }

        public Wheel(string Name)
        {
            this._Name = Name;
        }

        #region IVisitable 멤버

        public void accept(IVisitor visitor)
        {
            visitor.visit(this);
        }

        #endregion
    }

    public class Engine : IVisitable
    {
        #region IVisitable 멤버

        public void accept(IVisitor visitor)
        {
            visitor.visit(this);
        }

        #endregion
    }

    public class Body : IVisitable
    {
        #region IVisitable 멤버

        public void accept(IVisitor visitor)
        {
            visitor.visit(this);
        }

        #endregion
    }

    public class Car : IVisitable
    {
        private Engine _Engine = new Engine();
        private Body _Body = new Body();
        private Wheel[] _Wheels = new Wheel[]
            {
                new Wheel("front left"),
                new Wheel("front right"),
                new Wheel("back left"),
                new Wheel("back right"),
            };

        public Engine Engine
        {
            get
            {
                return this._Engine;
            }
        }

        public Body Body
        {
            get
            {
                return this._Body;
            }
        }

        public Wheel[] Wheels
        {
            get
            {
                return this._Wheels;
            }
        }
       
       
        #region IVisitable 멤버

        public void accept(IVisitor visitor)
        {
            visitor.visit(this);
            this._Engine.accept(visitor);
            this._Body.accept(visitor);
            foreach(Wheel wheel in this._Wheels)
            {
                wheel.accept(visitor);
            }
        }

        #endregion
    }

    public class PrintVisitor : IVisitor
    {

        #region IVisitor 멤버

        public void visit(Wheel wheel)
        {
            System.Console.WriteLine("Visiting " + wheel.Name + " wheel");
        }

        public void visit(Engine engine)
        {
            System.Console.WriteLine("Visiting engine");
        }

        public void visit(Body body)
        {
            System.Console.WriteLine("Visiting body");
        }

        public void visit(Car car)
        {
            System.Console.WriteLine("Visiting car");
        }

        #endregion
    }

    public class DoVisitor : IVisitor
    {

        #region IVisitor 멤버

        public void visit(Wheel wheel)
        {
            System.Console.WriteLine("Steering my wheel");
        }

        public void visit(Engine engine)
        {
            System.Console.WriteLine("Starting my engine");
        }

        public void visit(Body body)
        {
            System.Console.WriteLine("Moving my body");
        }

        public void visit(Car car)
        {
            System.Console.WriteLine("Vroom!");
        }

        #endregion
    }

    class Program
    {
        static void Main(string[] args)
        {
            Car car = new Car();
            IVisitor visitor = new PrintVisitor();
            IVisitor doVisitor = new DoVisitor();

            car.accept(visitor);
            car.accept(doVisitor);
        }
    }
}

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2007/11/06 09:53 2007/11/06 09:53
Posted by 나는산.

Leave your greetings here.

[로그인][오픈아이디란?]