设计模式-访问者模式-创新互联
场景:假设世界只有人和动物,人和动物都有很多情绪,并且表达情绪的方式不一样。
我们一直强调成都网站设计、成都网站制作、外贸网站建设对于企业的重要性,如果您也觉得重要,那么就需要我们慎重对待,选择一个安全靠谱的网站建设公司,企业网站我们建议是要么不做,要么就做好,让网站能真正成为企业发展过程中的有力推手。专业网络公司不一定是大公司,创新互联建站作为专业的网络公司选择我们就是放心。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();
}
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
文章名称:设计模式-访问者模式-创新互联
当前链接:http://scyanting.com/article/djiccj.html