本文介绍: 该实例基于WPF实现,直接上代码,下面为三层架构的代码。

该实例基于WPF实现,直接上代码,下面为三层架构的代码。

一 Model

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 设计模式练习.Model.访问者模式
{
    public class Computer : ComputerPart
    {

        ComputerPart[] parts;

        public Computer()
        {
            parts = new ComputerPart[] { new Mouse(), new Keyboard(), new Monitor() };
        }

        public void accept(ComputerPartVisitor partVisitor)
        {
            foreach (ComputerPart part in parts)
            {
                part.accept(partVisitor);
            }
            partVisitor.Visit(this);
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 设计模式练习.Model.访问者模式
{
    //1,创建访问接口
    public interface ComputerPart
    {
        public void accept(ComputerPartVisitor partVisitor);
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using 设计模式练习.Model.建造者模式;

namespace 设计模式练习.Model.访问者模式
{
    //3,创建实体访问类
    public class ComputerPartDisplayVisitor : ComputerPartVisitor
    {
        //记录访问信息
        public List<string> lists { get; } = new List<string>();

        public void Visit(Computer computer)
        {
            lists.Add(computer.GetType().Name);
        }

        public void Visit(Mouse mouse)
        {
            lists.Add(mouse.GetType().Name);
        }

        public void Visit(Keyboard keyboard)
        {
            lists.Add(keyboard.GetType().Name);
        }

        public void Visit(Monitor monitor)
        {
            lists.Add(monitor.GetType().Name);
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 设计模式练习.Model.访问者模式
{
    //2,创建访问者接口
    public interface ComputerPartVisitor
    {
        public void Visit(Computer computer);
        public void Visit(Mouse mouse);
        public void Visit(Keyboard keyboard);
        public void Visit(Monitor monitor);
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 设计模式练习.Model.访问者模式
{
    public class Keyboard : ComputerPart
    {
        public void accept(ComputerPartVisitor partVisitor)
        {
            partVisitor.Visit(this);
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 设计模式练习.Model.访问者模式
{
    public class Monitor : ComputerPart
    {
        public void accept(ComputerPartVisitor partVisitor)
        {
            partVisitor.Visit(this);
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 设计模式练习.Model.访问者模式
{
    public class Mouse : ComputerPart
    {
        public void accept(ComputerPartVisitor partVisitor)
        {
            partVisitor.Visit(this);
        }
    }
}

二 View

<Window x:Class="设计模式练习.View.访问者模式.ComputerWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:设计模式练习.View.访问者模式"
        mc:Ignorable="d"
        Title="ComputerWindow" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <TextBlock Text="{Binding Res}" Grid.Row="0" FontSize="30" TextWrapping="Wrap"/>
            <TextBlock Text="{Binding Res2}" Grid.Row="1" FontSize="30" TextWrapping="Wrap"/>
            <TextBlock Text="{Binding Res3}" Grid.Row="2" FontSize="30" TextWrapping="Wrap"/>
            <TextBlock Text="{Binding Res4}" Grid.Row="3" FontSize="30" TextWrapping="Wrap"/>

        </Grid>


        <Button Content="执行访问" Grid.Column="1" Command="{Binding visitCommand}"/>
    </Grid>
</Window>

三 ViewModel

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using 设计模式练习.Model.访问者模式;

namespace 设计模式练习.ViewModel.访问者模式
{
    partial class ComputerWindow_ViewModel : ObservableObject
    {
        [ObservableProperty]
        private string res;

        [ObservableProperty]
        private string res2;

        [ObservableProperty]
        private string res3;

        [ObservableProperty]
        private string res4;

        [RelayCommand]
        private void visit()
        {
            ComputerPart computer = new Computer();
            ComputerPartDisplayVisitor visitor = new ComputerPartDisplayVisitor();
            computer.accept(visitor);

            List<string> list = visitor.lists;
            Res = list[0];
            Res2 = list[1];
            Res3 = list[2];
            Res4 = list[3];
        }
    }
}

原文地址:https://blog.csdn.net/XiaoWang_csdn/article/details/135854879

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_62479.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注