欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

设计模式系列 - 访问者模式

程序员文章站 2022-05-04 13:44:50
访问者模式通过使用一个访问者类,是主业务改变执行算法 介绍 访问者模式属于行为型模式,通过依据不同的访问者来动态调整访问方式,将数据结构和数据操作进行分离,符合单一职责原则,扩展性较好。 类图描述 代码实现 1、定义组件接口 2、定义访问者 C public class Keyboard : ICo ......

访问者模式通过使用一个访问者类,是主业务改变执行算法

介绍

访问者模式属于行为型模式,通过依据不同的访问者来动态调整访问方式,将数据结构和数据操作进行分离,符合单一职责原则,扩展性较好。

类图描述

设计模式系列 - 访问者模式

代码实现

1、定义组件接口

public interface icomputerpart
{
    void accept(computerpartvisitor computerpartvisitor);
}

2、定义访问者

public class keyboard : icomputerpart
{
    public void accept(computerpartvisitor computerpartvisitor)
    {
        computerpartvisitor.visit(this);
    }
}

public class monitor : icomputerpart
{
    public void accept(computerpartvisitor computerpartvisitor)
    {
        computerpartvisitor.visit(this);
    }
}

public class mouse : icomputerpart
{
    public void accept(computerpartvisitor computerpartvisitor)
    {
        computerpartvisitor.visit(this);
    }
}

public class computer : icomputerpart
{
    readonly icomputerpart[] parts;
    public computer() => parts = new icomputerpart[] { new mouse(), new keyboard(), new monitor() };

    public void accept(computerpartvisitor computerpartvisitor)
    {
        for (int i = 0; i < parts.length; i++)
        {
            parts[i].accept(computerpartvisitor);
        }
        computerpartvisitor.visit(this);
    }
}

3、定义抽象访问者

public abstract class computerpartvisitor
{
    public abstract void visit(computer computer);
    public abstract void visit(mouse mouse);
    public abstract void visit(keyboard keyboard);
    public abstract void visit(monitor monitor);
}

4、实现访问者

public class computerpartdisplayvisitor : computerpartvisitor
{
    public override void visit(computer computer)
    {
        console.writeline("displaying computer");
    }

    public override void visit(mouse mouse)
    {
        console.writeline("displaying mouse");
    }

    public override void visit(keyboard keyboard)
    {
        console.writeline("displaying keyboard");
    }

    public override void visit(monitor monitor)
    {
        console.writeline("displaying monitor");
    }
}

5、上层调用

class program
{
    static void main(string[] args)
    {
        icomputerpart computer = new computer();
        computer.accept(new computerpartdisplayvisitor());
        console.readkey();
    }
}

总结

访问者模式对访问功能进行统一管理,通过再被访问者的类中加几个对外提供接待访问者的接口,从而改变具体访问者的执行方式。