首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >CSharp: null object Pattern in donet 6

CSharp: null object Pattern in donet 6

作者头像
geovindu
发布2026-06-19 09:44:57
发布2026-06-19 09:44:57
710
举报
代码语言:javascript
复制
/// <summary>
    /// 空对象模式 null object Pattern
    ///
    /// </summary>
    public abstract class Application
    {
 
        /// <summary>
        ///
        /// </summary>
        private static readonly NullApplication NullApplication = new NullApplication();
        /// <summary>
        ///
        /// </summary>
        /// <param name="processId"></param>
        public Application(Guid processId)
        {
            ProcessId = processId;
        }
        /// <summary>
        ///
        /// </summary>
        public static NullApplication Default
        {
            get
            {
                return NullApplication;
            }
        }
        /// <summary>
        ///
        /// </summary>
        public abstract string Name { get; }
        /// <summary>
        ///
        /// </summary>
        public Guid ProcessId { get; }
        /// <summary>
        ///
        /// </summary>
        public virtual void Open()
        {
            Console.WriteLine($"应用程序 {Name} 已经打开.");
        }
        /// <summary>
        ///
        /// </summary>
        public virtual void Close()
        {
            Console.WriteLine($"应用程序 {Name} 已经关闭.");
        }
    }
 
 
 
    /// <summary>
    /// 空对象模式 null object Pattern
    /// </summary>
    public class NullApplication : Application
    {
 
        /// <summary>
        ///
        /// </summary>
        public NullApplication()
            : base(Guid.Empty)
        {
        }
        /// <summary>
        ///
        /// </summary>
        public override string Name => string.Empty;
        /// <summary>
        ///
        /// </summary>
        public override void Open()
        {
        }
        /// <summary>
        ///
        /// </summary>
        public override void Close()
        {
        }
    }
 
 
    /// <summary>
    ///
    /// </summary>
    public class Gmail : Application
    {
 
        /// <summary>
        ///
        /// </summary>
        /// <param name="processId"></param>
        public Gmail(Guid processId)
            : base(processId)
        {
        }
        /// <summary>
        ///
        /// </summary>
        public override string Name => "Gmail";
    }
 
   /// <summary>
    ///
    /// </summary>
    public class SubwaySurfers : Application
    {
 
        /// <summary>
        ///
        /// </summary>
        /// <param name="processId"></param>
        public SubwaySurfers(Guid processId)
            : base(processId)
        {
        }
        /// <summary>
        ///
        /// </summary>
        public override string Name => "Subway Surfers";
    }
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Geovin.Du.DuNullObject.Applications.Common;
 
 
namespace Geovin.Du.DuNullObject.Applications
{
 
    /// <summary>
    ///
    /// </summary>
    public class GeovinDu : Application
    {
 
        /// <summary>
        ///
        /// </summary>
        /// <param name="processId"></param>
        public GeovinDu(Guid processId)
            : base(processId)
        {
        }
        /// <summary>
        ///
        /// </summary>
        public override string Name => "GeovinDu";
    }
}
 
   /// <summary>
    ///
    /// </summary>
    public class ApplicationRepository
    {
 
        /// <summary>
        ///
        /// </summary>
        private readonly Dictionary<Guid, Application> _installedApplications;
 
 
        /// <summary>
        ///
        /// </summary>
        public ApplicationRepository()
        {
            var gmailProcessId = new Guid("6a3852ab-0973-4d1b-82d8-edd131c5f0a9");
            var subwaySurfersProcessId = new Guid("c8bc60c6-f1d2-484f-91ee-a6e6dec9e782");
            var geovinduProcessId = new Guid("2b8ba9a3-4f83-4f86-96a8-94daf79fa4bd");
 
            _installedApplications = new Dictionary<Guid, Application>
            {
                { gmailProcessId, new Gmail(gmailProcessId) },
                { subwaySurfersProcessId, new SubwaySurfers(subwaySurfersProcessId) },
                { geovinduProcessId, new GeovinDu(geovinduProcessId) },
            };
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="processId"></param>
        /// <returns></returns>
        public Application Find(Guid processId)
        {
            if (_installedApplications.TryGetValue(processId, out Application application))
            {
                return application;
            }
 
            return Application.Default;
        }
    }
 
    /// <summary>
    /// 空对象模式 null object Pattern
    /// geovindu,Geovin Du,涂聚文
    /// </summary>
    public static class SmartphoneApplicationExecutor
    {
 
        /// <summary>
        ///
        /// </summary>
        public static void Execute()
        {
 
            ConsoleExtension.WriteSeparator("小手机应用程序 Demo");
 
            var applicationRepository = new ApplicationRepository();
 
            var validProcessId = new Guid("6a3852ab-0973-4d1b-82d8-edd131c5f0a9");
            var invalidProcessId = Guid.Empty;
 
            var gmail = applicationRepository.Find(validProcessId);
            gmail.Open();
            gmail.Close();
 
            // Null exception won't be thrown if an application with the specified process ID can't be found.
            // In that case, default (NULL) object will be returned.
            var geovindu = applicationRepository.Find(invalidProcessId);
            geovindu.Open();
            geovindu.Close();
        }
    }

调用:

代码语言:javascript
复制
Console.WriteLine("Hello, Geovin Du! 学习 .net 6 ");
//Geovin.Du.DuEmail.EmailExecutor.Execute();
//Geovin.Du.DuStock.StockExecutor.Execute();
// Geovin.Du.DuShoppingCart.ShoppingCartExecutor.Execute();
Geovin.Du.DuNullObject.SmartphoneApplicationExecutor.Execute();

输出:

代码语言:javascript
复制
Hello, Geovin Du! 学习 .net 6
 
小手机应用程序 Demo
--------------------------------------------------
应用程序 Gmail 已经打开.
应用程序 Gmail 已经关闭.
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档