博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式-访问者模式
阅读量:6517 次
发布时间:2019-06-24

本文共 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    {        List
list = 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

你可能感兴趣的文章
C#基础第五天
查看>>
uva 12325 枚举暴力 b
查看>>
多线程问题(JVM重排序)
查看>>
POJ 3268 Silver Cow Party
查看>>
EMLS项目推进思考
查看>>
Eclipse快捷键 10个最有用的快捷键
查看>>
2018-2019-1 20165302 实验五 通讯协议设计
查看>>
Golang 知识点总结
查看>>
JAVA 8 特性
查看>>
算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列
查看>>
WebService之Axis2快速入门(7): Spring与axis整合发布为WebServic
查看>>
Uliweb查看模板调用关系
查看>>
C#与PHP通信压缩
查看>>
关于 Linux
查看>>
ios开发之导航控制器的原理
查看>>
《Netkiller Blockchain 手札》Hyperledger Fabric Java SDK Demo
查看>>
Linux系统_Centos7下安装Nginx
查看>>
《PHP和MySQL Web 开发》 第12章 MySQL高级管理
查看>>
数据库设计 Step by Step (6) —— 提取业务规则
查看>>
Redis客户端redisson实战
查看>>