0

有没有更好的解决方案通过不同的类将数据从一个类发送到另一个类?我在 ImageProccessing 类中有图像,我想把他送到 MainForm 类。

  • MainForm.cs (图形用户界面)
  • 视频处理.cs
  • 图像处理.cs

我有这个伪代码:

    class MainForm : Form
    {
        VideoProccessing _video = new VideoProccessing();
    }

    class VideoProccessing
    {
        ImageProccessing _image = new ImageProccessing();
    }

    class ImageProccessing
    {
        Bitmap _bmp = null;

        public void SomeBadassProcess()
        {
            _bmp = new Bitmap();          //How to send this to MainForm (GUI)
        }
    }

我的解决方案:

    class MainForm : Form
    {
        VideoProccessing _video = new VideoProccessing();
        _video.SendAgain += (ShowImage);

        private void ShowImage(Bitmap bmp)
        {
            SomePictureBox.Image = bmp;
        }

    }

    class VideoProccessing
    {
        ImageProccessing _image = new ImageProccessing();
        _image.Send += (ReceivedImage)

        public delegate void SendAgainImage(Bitmap bmp);
        public event SendAgainImage SendAgain;

        private void ReceivedImage(Bitmap bmp)
        {
            SendAgain(bmp);
        }
    }

    class ImageProccessing
    {
        Bitmap _bmp = null;

        public delegate void SendImage(Bitmap bmp);
        public event SendImage Send;

        public void SomeBadassProcess()
        {
            _bmp = new Bitmap();          //How to send this to MainForm (GUI)

            Send(_bmp);
        }
    }
4

1 回答 1

1

但是,如果您的VideoProcessing班级对班级有依赖性ImageProcessing,那么您只希望MainForm知道VideoProcessing,那么以您的方式传播您的消息可能是可以接受的。但是,它确实在您的对象之间创建了强耦合,您在这个阶段可能会或可能不会关心。

另一种方法可能是使用某种消息总线,例如 anEventAggregator或 a Mediator。这两种行为模式都旨在解耦消息传递过程中涉及的对象并提供一种publish/subscribe机制。

例如,如果您要实现EventAggregatoryour MainFormwould be a subscriber,则监听从publisher您的场景中的ImageProcessing类发送的通知。

一个人为的代码示例可能如下所示:

public class MainForm : Form
{
    private readonly EventAggregator eventAggregator;
    private readonly VideoProcessing videoProcessing;

    public MainForm()
    {
        this.eventAggregator = new EventAggregator();
        this.eventAggregator.Subscribe<NewBitmapEvent>(HandleNewBitMap);
        this.videoProcessing = new VideoProcessing(this.eventAggregator);
    }

    private void HandleNewBitmap(Bitmap args)
    {
        // Do something
    }
}

public class VideoProcessing
{
    private readonly EventAggregator eventAggregator;

    private readonly ImageProcessing imageProcessing;

    public VideoProcessing(EventAggregator eventAggregator)
    {
        this.eventAggregator = eventAggregator;
        this.imageProcessing = new ImageProcessing(this.eventAggregator);
    }
}


public class ImageProcessing
{
    private readonly EventAggregator eventAggregator;

    public ImageProcessing(EventAggregator eventAggregator)
    {
        this.eventAggregator = eventAggregator;
        this.eventAggregator.Publish<NewBitmapEvent>(new Bitmap(...));
    }
}

ImageProcessingpublishesaNewBitmapEvent时,仅MainForm通知它,而不是VideoProcessing类通知subscribed事件。显然,如果订阅了其他类,那么他们也会在事件发生时收到通知published

于 2013-12-09T01:01:26.687 回答