天天看點

通路者模式(五)

通路者模式就是某一個對象或一組對象,具有不同的行為,并這些行為是靈活多變的,在該對象或該組對象相對穩定的情況下,對這些行為進行抽象,解除對象跟行為之間的耦合關系.

比如電商網站一般有普通,白銀,黃金,鑽石 4個級别的會員

會經常舉行各種各樣的活動,元旦,情人節,五一,周年,中秋,雙11等等等.每次活動可能對每個級别的會員又都不一樣。

在這裡,會員級别是相對穩定的。而活動是多變的。

首先我們定義一個抽象類BaseMember,所有會員的基類

    public abstract class BaseMember
    {
        public abstract void Member();
        public abstract void Activity();
    }      

定義了Member和Activity二個抽象方法,子類實作

假設是現在元旦活動 滿xx減xx

public class NormalMember : BaseMember
    {
        public override void Member()
        {
            Console.WriteLine("普通會員");
        }
        public override void Activity()
        {
            Console.WriteLine("滿200減20");
        }
    }      
    public class SilverMember:BaseMember
    {
        public override void Member()
        {
            Console.WriteLine("白銀會員");
        }
        public override void Activity()
        {
            Console.WriteLine("滿190減20");
        }
    }      
    public class GoldMember:BaseMember
    {
        public override void Member()
        {
            Console.WriteLine("黃金會員");
        }
        public override void Activity()
        {
            Console.WriteLine("滿180減20");
        }
    }      
    public class DiamondMember:BaseMember
    {
        public override void Member()
        {
            Console.WriteLine("鑽石會員");
        }
        public override void Activity()
        {
            Console.WriteLine("滿170減20");
        }
    }      
        static void Main(string[] args)
        {
            List<BaseMember> listMember = new List<BaseMember>
            {
                new NormalMember(),
                new SilverMember(),
                new GoldMember(),
                new DiamondMember(),
            };
            foreach (var item in listMember)
            {
                item.Member();
                item.Activity();
            }
            Console.ReadKey();
        }      

運作看看結果

通路者模式(五)

沒問題,完美實作。

現在元旦活動結束了,準備開始情人節活動。怎麼辦? 我們開始一個一個類去修改,不利于維護,容易出錯。 

試試用通路者模式來實作,IVisitor接口不能少

    public interface IVisitor
    {
        void NormalMemberVisitor(BaseMember baseMember);
        void SilverMemberVisitor(BaseMember baseMember);
        void GoldMemberVisitor(BaseMember baseMember);
        void DiamondMemberVisitor(BaseMember baseMember);
    }      

實作IVisitor

    public class YdActivityVisitor : IVisitor
    {
        public void DiamondMemberVisitor(BaseMember baseMember)
        {
            Console.WriteLine("滿170減20");
        }
        public void GoldMemberVisitor(BaseMember baseMember)
        {
            Console.WriteLine("滿180減20");
        }
        public void NormalMemberVisitor(BaseMember baseMember)
        {
            Console.WriteLine("滿200減20");
        }
        public void SilverMemberVisitor(BaseMember baseMember)
        {
            Console.WriteLine("滿190減20");
        }
    }      

BaseMember的Activity方法增加參數IVisitor

    public abstract class BaseMember
    {
        public abstract void Member();
        public abstract void Activity(IVisitor visitor);
    }      
public class NormalMember : BaseMember
    {
        public override void Member()
        {
            Console.WriteLine("普通會員");
        }
        public override void Activity(IVisitor visitor)
        {
            visitor.NormalMemberVisitor(this);
        }
    }
    public class SilverMember:BaseMember
    {
        public override void Member()
        {
            Console.WriteLine("白銀會員");
        }
        public override void Activity(IVisitor visitor)
        {
            visitor.SilverMemberVisitor(this);
        }
    }
    public class GoldMember:BaseMember
    {
        public override void Member()
        {
            Console.WriteLine("黃金會員");
        }
        public override void Activity(IVisitor visitor)
        {
            visitor.GoldMemberVisitor(this);
        }
    }
    public class DiamondMember:BaseMember
    {
        public override void Member()
        {
            Console.WriteLine("鑽石會員");
        }
        
        public override void Activity(IVisitor visitor)
        {
            visitor.DiamondMemberVisitor(this);
        }
    }      

 Main 修改下 添加IVisitor對象

static void Main(string[] args)
        {
            List<BaseMember> listMember = new List<BaseMember>
            {
                new NormalMember(),
                new SilverMember(),
                new GoldMember(),
                new DiamondMember(),
            };
            IVisitor visitor = new YdActivityVisitor();
            foreach (var item in listMember)
            { 
                  Console.WriteLine("visitor ");
                item.Member();
                item.Activity(visitor);
            }
            Console.ReadKey();
        }      

執行結果

通路者模式(五)

那現在我們再添加一個情人節活動:

public class ValentineActivity : IVisitor
    {
        public ValentineActivity()
        {
            Console.WriteLine("情人節活動開始啦!!!!");
        }
        public void DiamondMemberVisitor(BaseMember baseMember)
        {
            Console.WriteLine("買十盒送四盒");
        }
        public void GoldMemberVisitor(BaseMember baseMember)
        {
            Console.WriteLine("買十盒送三盒");
        }
        public void NormalMemberVisitor(BaseMember baseMember)
        {
            Console.WriteLine("買十盒送一盒");
        }
        public void SilverMemberVisitor(BaseMember baseMember)
        {
            Console.WriteLine("買十盒送二盒");
        }
    }      

隻需修改

//IVisitor visitor = new YdActivityVisitor();
IVisitor visitor = new ValentineActivity();      

繼續閱讀