假设我们需要开发一个自动清理图片的系统,其功能是监控指定目录下的图片文件,当图片文件超过一定的时间没有被访问时,就会自动删除这些图片文件。我们可以使用观察者模式来实现这个系统。

首先,我们需要定义一个观察者接口IImageObserver,用于通知需要清理的图片文件。具体实现如下:

public interface IImageObserver
{
    void OnImageAccessed(string imagePath);
}

然后,我们需要定义一个被观察者类ImageManager,用于监控指定目录下的图片文件。具体实现如下:

public class ImageManager
{
    private readonly List<IImageObserver> _observers = new List<IImageObserver>();
    private readonly string _directoryPath;
    private readonly int _expireSeconds;

    public ImageManager(string directoryPath, int expireSeconds)
    {
        _directoryPath = directoryPath;
        _expireSeconds = expireSeconds;

        // 在构造函数中启动监控线程
        Thread thread = new Thread(MonitorDirectory);
        thread.IsBackground = true;
        thread.Start();
    }

    public void Attach(IImageObserver observer)
    {
        _observers.Add(observer);
    }

    public void Detach(IImageObserver observer)
    {
        _observers.Remove(observer);
    }

    private void MonitorDirectory()
    {
        while (true)
        {
            try
            {
                DirectoryInfo directory = new DirectoryInfo(_directoryPath);
                if (!directory.Exists)
                    return;

                foreach (var file in directory.GetFiles())
                {
                    if (file.Extension.ToLower() == ".jpg" || file.Extension.ToLower() == ".png")
                    {
                        DateTime lastAccessTime = file.LastAccessTime;
                        TimeSpan timeSpan = DateTime.Now - lastAccessTime;
                        if (timeSpan.TotalSeconds > _expireSeconds)
                        {
                            file.Delete();
                            NotifyObservers(file.FullName);
                        }
                    }
                }
            }
            catch
            {
                // 忽略异常,继续监控
            }

            // 每隔一定时间扫描一次目录
            Thread.Sleep(1000);
        }
    }

    private void NotifyObservers(string imagePath)
    {
        foreach (var observer in _observers)
        {
            observer.OnImageAccessed(imagePath);
        }
    }
}

在ImageManager类中,我们维护了一个观察者列表_observers,并在构造函数中启动了一个监控线程MonitorDirectory,用于扫描指定目录下的图片文件。当图片文件超过一定的时间没有被访问时,我们会删除这些图片文件,并调用NotifyObservers方法通知所有的观察者。

最后,我们可以定义一个具体的观察者类ImageCleaner,用于清理被删除的图片文件。具体实现如下:

public class ImageCleaner : IImageObserver
{
    public void OnImageAccessed(string imagePath)
    {
        Console.WriteLine($"Image file {imagePath} has been deleted.");
    }
}

在这个具体的观察者类中,我们实现了OnImageAccessed方法,当被观察到需要清理的图片文件时,会打印出相应的日志信息。

最终,我们可以在主函数中使用这些类来实现自动清理图片的系统。具体实现如下:

static void Main(string[] args)
{
    ImageManager imageManager = new ImageManager(@"C:\Images", 3600);
    ImageCleaner imageCleaner = new ImageCleaner();
    imageManager.Attach(imageCleaner);

    Console.ReadKey();
}

在主函数中,我们创建了一个ImageManager对象,用于监控指定目录下的图片文件。我们还创建了一个ImageCleaner对象,并将其注册为ImageManager的观察者。这样,当ImageManager删除图片文件时,ImageCleaner会自动清理这些被删除的图片文件,并打印出相应的日志信息。

以上就是使用观察者模式来实现自动清理图片的系统的一个简单例子。

04-24 00:49