我尝试实现访问者模式,并对使用is和as关键字有疑问。在使用它们时,是否有很大的性能影响?
class Program
{
static void Main(string[] args)
{
List<IVisitor> visitors = new List<IVisitor>();
visitors.AddRange(new List<IVisitor>()
{
new PersonVisitor(),
new AnimalVisitor()
});
List<Creature> creatures = new List<Creature>();
creatures.AddRange(new List<Creature>()
{
new Person() { Name = "Frank" },
new Person() { Name = "Tony" },
new Person() { Name = "Amy" },
new Animal() { Name = "Bubbles" },
new Animal() { Name = "Max" }
});
CreatureProcessor creatureProcessor = new CreatureProcessor(creatures, visitors);
creatureProcessor.Process();
Console.ReadKey();
}
}
interface IVisitor
{
void Visit(IElement element);
}
interface IElement
{
void Accept(IVisitor visitor);
}
class PersonVisitor : IVisitor
{
public void Visit(IElement element)
{
if (element is Person)
{
Creature creature = element as Person;
Console.WriteLine("{0} is a good {1}", creature.Name, "Person");
}
}
}
class AnimalVisitor : IVisitor
{
public void Visit(IElement element)
{
if (element is Animal)
{
Creature creature = element as Animal;
Console.WriteLine("{0} is a good {1}", creature.Name, "Animal");
}
}
}
class Person : Creature
{
}
class Animal : Creature
{
}
abstract class Creature : IElement
{
public string Name { get; set; }
public void Accept(IVisitor visitor)
{
visitor.Visit(this);
}
}
class CreatureProcessor
{
private readonly List<IVisitor> visitors;
private readonly List<Creature> creatures;
public CreatureProcessor(List<Creature> creatures, List<IVisitor> visitors)
{
this.creatures = creatures;
this.visitors = visitors;
}
public void Process()
{
foreach (IVisitor visitor in visitors)
{
foreach (Creature creature in creatures)
{
creature.Accept(visitor);
}
}
}
}它的工作方式,我应该怎么想,所以谁愿意批评它呢?
发布于 2015-10-19 10:04:25
只关注is和as
类PersonVisitor : IVisitor {公共空访问(IElement元素){ if (元素为人){生物=元素为人;Console.WriteLine("{0}是良好的{1}“、creature.Name、”人“);}}
is基本上与as相同。它正在对所讨论的对象执行一个软广播,一个没有抛出异常的强制转换。不同之处在于,is返回一个bool,说明结果,而as返回成功,返回已抛出的对象,否则返回null。所以你做了两次同样的事。
一个更好、更快的方法会是这样。
class PersonVisitor : IVisitor
{
public void Visit(IElement element)
{
Creature creature = element as Person;
if (creature != null)
{
Console.WriteLine("{0} is a good {1}", creature.Name, "Person");
}
}
}https://codereview.stackexchange.com/questions/108001
复制相似问题