网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

设计模式-访问者模式

场景:假设世界只有人和动物,人和动物都有很多情绪,并且表达情绪的方式不一样。

创新互联技术团队十余年来致力于为客户提供网站建设、成都网站制作成都品牌网站建设营销型网站建设、搜索引擎SEO优化等服务。经过多年发展,公司拥有经验丰富的技术团队,先后服务、推广了成百上千家网站,包括各类中小企业、企事单位、高校等机构单位。

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();
        }

文章名称:设计模式-访问者模式
转载来于:http://bjjierui.cn/article/ippdpe.html

其他资讯