2013年10月3日 星期四

設計模式 (五) Visitor Pattern

參觀者模式  其實概念就是將演算法跟結構做分離
下面的範例使用將學生的成績利用兩個演算法做排序 ( BigToSmall , SmallToBig)
使用訪問者模式的好處是
1.針對結構新增演算法時只需要新增class即可
2.參觀者所做的操作都集中在class 裡 trace 較方便
缺點是

1.當需要針對該結構做更改時  會影響到所有演算法 (更改會較困難)



    abstract class Visitor

    {

        abstract public void Visit(Element element);

    }



    class BigToSmallVisitor : Visitor

    {



        public override void Visit(Element element)

        {

            ScoreSheet sheet = (ScoreSheet)element;



            sheet.ScoreList.Sort((x, y) => { return -x.Score.CompareTo(y.Score); });



            foreach (ScoreData item in sheet.ScoreList)

            {

                Console.WriteLine(item.Name + " / " + item.Score);

            }

        }

    }



    class SmallToBigVisitor : Visitor

    {



        public override void Visit(Element element)

        {

            ScoreSheet sheet = (ScoreSheet)element;



            sheet.ScoreList.Sort((x, y) => { return x.Score.CompareTo(y.Score); });



            foreach (ScoreData item in sheet.ScoreList)

            {

                Console.WriteLine(item.Name + " / " + item.Score);

            }

        }

    }



    class ScoreData

    {

        private int score;

        private string name;

        public int Score

        {

            get { return score; }

            set { score = value; }

        }

        public string Name

        {

            get { return name; }

            set { name = value; }

        }



        public ScoreData(string name, int score)

        {

            this.Name = name;

            this.Score = score;

        }

    }



    abstract class Element

    {

        abstract public void Accept(Visitor visitor);

    }



    class ScoreSheet : Element

    {

        public List<ScoreData> ScoreList = new List<ScoreData>();

        public void Add(ScoreData data)

        {

            ScoreList.Add(data);

        }

        public override void Accept(Visitor visitor)

        {

            visitor.Visit(this);

        }

    }

    public class VisitorApp

    {

        public static void Main(string[] args)

        {

            ScoreSheet sheet = new ScoreSheet();

            sheet.Add(new ScoreData("John", 100));

            sheet.Add(new ScoreData("Marry", 90));

            sheet.Add(new ScoreData("Ted", 60));

            sheet.Add(new ScoreData("Bob", 70));

            BigToSmallVisitor bigtosmall = new BigToSmallVisitor();

            SmallToBigVisitor smalltobig = new SmallToBigVisitor();

            Console.WriteLine("=================");

            sheet.Accept(bigtosmall);

            Console.WriteLine("=================");

            sheet.Accept(smalltobig);

            Console.ReadKey();

        }

    }
Result:
 =================
 John / 100 
 Marry / 90 
 Bob / 70 
 Ted / 60 
 ================= 
 Ted / 60 
 Bob / 70 
 Marry / 90 
 John / 100

沒有留言:

張貼留言