通路者模式就是某一個對象或一組對象,具有不同的行為,并這些行為是靈活多變的,在該對象或該組對象相對穩定的情況下,對這些行為進行抽象,解除對象跟行為之間的耦合關系.
比如電商網站一般有普通,白銀,黃金,鑽石 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();