1. 程式人生 > >《大話設計模式》--男人和女人--訪問者模式(28)

《大話設計模式》--男人和女人--訪問者模式(28)

V:表示一個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。

訪問者模式適用於資料結構相對穩定的系統。它把資料結構和作用於結構上的操作之間的耦合解脫開,使得操作集合可以相對自由地演化。

訪問者模式的目的是要把處理從資料結構分離出來。有比較穩定的資料結構,又有易於變化的演算法的話,使用訪問者模式就是比較合適的,因為訪問者模式使得演算法操作的增加變得容易。

優點:仿問者模式的優點就是增加新的操作很容易,因為增加新的操作就意味著增加一個新的訪問者。訪問者模式將有關的行為集中到一個訪問者物件中。

缺點:使增加新的資料結構變得困難了。

abstract class State
    {
        public abstract void GetManConclusion(Male male);
        public abstract void GetWomanConclusion(Female female);
    }
class Success:State
    {
        public override void GetManConclusion(Male male)
        {
            Console.WriteLine(string.Format("{0} {1}時,背後多半有一個偉大的女人。", male.GetType().Name, this.GetType().Name));
        }

        public override void GetWomanConclusion(Female female)
        {
            Console.WriteLine(string.Format("{0} {1}時,背後大多有一個不成功的男人。", female.GetType().Name, this.GetType().Name));
        }
    }
class Failure:State
    {
        public override void GetManConclusion(Male male)
        {
            Console.WriteLine(string.Format("{0} {1}時,悶頭喝酒,誰也不用勸。", male.GetType().Name, this.GetType().Name));
        }

        public override void GetWomanConclusion(Female female)
        {
            Console.WriteLine(string.Format("{0} {1}時,眼淚汪汪,誰也勸不了。", female.GetType().Name, this.GetType().Name));
        }
    }
class Love:State
    {
        public override void GetManConclusion(Male male)
        {
            Console.WriteLine(string.Format("{0} {1}時,凡事不懂也要裝懂。", male.GetType().Name, this.GetType().Name));
        }

        public override void GetWomanConclusion(Female female)
        {
            Console.WriteLine(string.Format("{0} {1}時,遇事懂也裝作不懂。", female.GetType().Name, this.GetType().Name));
        }
    }
class Marriage : State
    {
        public override void GetManConclusion(Male male)
        {
            Console.WriteLine(string.Format("{0} {1}時,感慨道:戀愛遊戲終結時,‘有妻徒刑’遙無期。", male.GetType().Name, this.GetType().Name));
        }

        public override void GetWomanConclusion(Female female)
        {
            Console.WriteLine(string.Format("{0} {1}時,欣慰道:愛情長跑路漫漫,婚姻保險保平安。", female.GetType().Name, this.GetType().Name));
        }
    }
abstract class Human
    {
        public abstract void Accept(State state);
    }
class Male:Human
    {
        public override void Accept(State state)
        {
            state.GetManConclusion(this);
        }
    }
class Female:Human
    {
        public override void Accept(State state)
        {
            state.GetWomanConclusion(this);
        }
    }
class ObjectStructure
    {
        private IList<Human> elements = new List<Human>();

        public void Attach(Human element)
        {
            elements.Add(element);
        }

        public void Detach(Human element)
        {
            elements.Remove(element);
        }

        public void Display(State1 state)
        {
            foreach (Human element in elements)
            {
                element.Accept(state);
            }
        }
    }
            ObjectStructure os = new ObjectStructure();
            os.Attach(new Male());
            os.Attach(new Female());

            Success s = new Success();
            os.Display(s);

            Failure f = new Failure();
            os.Display(f);

            Love l = new Love();
            os.Display(l);

            Marriage m = new Marriage();
            os.Display(m);