本文共 3757 字,大约阅读时间需要 12 分钟。
场景:假设世界只有人和动物,人和动物都有很多情绪,并且表达情绪的方式不一样。
abstract class World { abstract public void DoSomething(State state); } class Person : World { public override void DoSomething(State state) { state.PersonDoSomething(this);//双分派技术 } } class Animal : World { public override void DoSomething(State state) { state.AnimalDoSomething(this); } }//状态abstract class State { public abstract void PersonDoSomething(World world); public abstract void AnimalDoSomething(World world); } class Happy : State { public override void AnimalDoSomething(World world) { Console.WriteLine("动物高兴的时候叫"); } public override void PersonDoSomething(World world) { Console.WriteLine("人高兴的时候笑"); } } class Sad : State { public override void AnimalDoSomething(World world) { Console.WriteLine("动物伤心的时候吼"); } public override void PersonDoSomething(World world) { Console.WriteLine("人伤心的时候哭"); } } //对象结构 class Context { Listlist = new List (); public void Add(World w) { list.Add(w); } public void Remove(World w) { list.Remove(w); } public void Display(State state) { foreach (var item in list) { item.DoSomething(state); } } } //前端: static void Main(string[] args) { World w1 = new Person(); World w2 = new Animal(); Context c = new Context(); c.Add(w1); c.Add(w2); State h = new Happy(); State s = new Sad(); c.Display(h); c.Display(s); Console.Read(); }
总结:只有数据结构稳定的时候才能用他,不然增加元素会破坏开闭原则。该模式把元素和元素的状态分解开了。类似于桥接模式。利于扩展处理方式,上面代码是要哀伤和高兴两种情绪,很轻易就可以加入第三种情绪而不改变任何已有代码。
优点:状态和结构分离,易于扩展状态。缺点:复杂,只适用数据结构稳定的情况。桥接模式也是把处理和结构相分离,用桥接实现上面代码如下。
abstract class World { abstract public void DoSomething(State state); } class Person : World { public override void DoSomething(State state) { state.DoSomething(this); } } class Animal : World { public override void DoSomething(State state) { state.DoSomething(this); } }abstract class State { public abstract void DoSomething(World world); } class Happy : State { //要区分人和动物高兴时候的表达方式(‘叫‘或者’笑’),需要在World中定义 public override void DoSomething(World world) { Console.WriteLine("{0}高兴的时候叫",world.GetType().FullName); } } class Sad : State { public override void DoSomething(World world) { Console.WriteLine("{0}伤心的时候吼", world.GetType().FullName); } } //前端 static void Main(string[] args) { //World w1 = new Person(); //World w2 = new Animal(); //Context c = new Context(); //c.Add(w1); //c.Add(w2); //State h = new Happy(); //State s = new Sad(); //c.Display(h); //c.Display(s); //Console.Read(); 访问者模式.桥接模式.World w1 = new 访问者模式.桥接模式.Person(); 访问者模式.桥接模式.World w2 = new 访问者模式.桥接模式.Animal(); 访问者模式.桥接模式.State s = new 访问者模式.桥接模式.Happy(); 访问者模式.桥接模式.State s2 = new 访问者模式.桥接模式.Sad(); w1.DoSomething(s); w1.DoSomething(s2); w2.DoSomething(s); w2.DoSomething(s2); Console.Read(); }
转载于:https://blog.51cto.com/5591787/2122100