首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问者模式的实现

访问者模式的实现
EN

Code Review用户
提问于 2015-10-19 03:46:24
回答 1查看 702关注 0票数 3

我尝试实现访问者模式,并对使用isas关键字有疑问。在使用它们时,是否有很大的性能影响?

代码语言:javascript
复制
 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);
            }
        }
    }
}

它的工作方式,我应该怎么想,所以谁愿意批评它呢?

EN

回答 1

Code Review用户

发布于 2015-10-19 10:04:25

只关注isas

类PersonVisitor : IVisitor {公共空访问(IElement元素){ if (元素为人){生物=元素为人;Console.WriteLine("{0}是良好的{1}“、creature.Name、”人“);}}

is基本上与as相同。它正在对所讨论的对象执行一个软广播,一个没有抛出异常的强制转换。不同之处在于,is返回一个bool,说明结果,而as返回成功,返回已抛出的对象,否则返回null。所以你做了两次同样的事。

一个更好、更快的方法会是这样。

代码语言:javascript
复制
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");
        }
    }
}
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/108001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档