使用装饰器模式做类的增强

简介: 我们已经实现了用户注册功能,现在想增加日志记录功能。具体来讲就是在用户注册前后,分别输出一条日志。

我们已经实现了用户注册功能,现在想增加日志记录功能。具体来讲就是在用户注册前后,分别输出一条日志。我们当然可以修改原有的业务代码。

现在换个角度来问两个问题:
1. 团队开发中,我们很可能根本拿不到源代码,那又怎么去增加这个功能呢?
2. 这次需求是增加日志,以后再增加其他需求(比如异常处理),是不是仍然要改业务类呢?

总结一下:
我们要在不修改原有类业务代码的前提下,去做类的增强。我们的设计要符合面向对象的原则:对扩展开放,对修改封闭

都有哪些办法呢?我们尝试以下几种方法:


原有业务类

业务模型

namespace testAopByDecorator
{
    public class User
    {
        public string Name { get; set; }
        public int Id { get; set; }
    }
}

接口设计

namespace testAopByDecorator
{
    public interface IUserProcessor
    {
        void RegisterUser(User user);
    }
}

业务实现

using System;

namespace testAopByDecorator
{
    public class UserProcessor : IUserProcessor
    {
        public void RegisterUser(User user)
        {
            if (user == null)
            {
                return;
            }

            Console.WriteLine(string.Format("注册了一个用户{0}:{1}", user.Id, user.Name));
        }
    }
}

上层调用

using System;

namespace testAopByDecorator
{
    class Program
    {
        private static User user = new User { Id = 1, Name = "滇红" };

        static void Main(string[] args)
        {
            Register();
            Console.ReadKey();
        }

        private static void Register()
        {
            IUserProcessor processor = new UserProcessor();
            processor.RegisterUser(user);
        }
    }
}

使用装饰器模式做类的增强

装饰器类

using System;

namespace testAopByDecorator
{
    public class UserProcessorDecorator : IUserProcessor
    {
        private IUserProcessor _processor;

        public UserProcessorDecorator(IUserProcessor processor)
        {
            this._processor = processor;
        }

        public void RegisterUser(User user)
        {
            if (this._processor == null)
            {
                return;
            }

            before(user);
            this._processor.RegisterUser(user);
            after(user);
        }

        private void after(User user)
        {
            Console.WriteLine("注册用户后:" + user.Name);
        }

        private void before(User user)
        {
            Console.WriteLine("注册用户前:" + user.Name);
        }
    }
}

上层调用

using System;

namespace testAopByDecorator
{
    class Program
    {
        private static User user = new User { Id = 1, Name = "滇红" };

        static void Main(string[] args)
        {
            RegisterAndLog();
            Console.ReadKey();
        }

        private static void RegisterAndLog()
        {
            IUserProcessor processor = new UserProcessor();
            IUserProcessor decorator = new UserProcessorDecorator(processor);//装饰原有业务类
            decorator.RegisterUser(user);//遵守接口契约
        }
    }
}

对比一下扩展前后的业务展现
这里写图片描述

相关文章
|
弹性计算 安全 Ubuntu
docker启动容器提示read init-p: connection reset by peer: unknown问题
docker启动容器提示read init-p: connection reset by peer: unknown问题
|
10月前
|
存储 JSON Java
1688订单接口获取指南
在电子商务中,订单数据的获取和管理至关重要。1688作为中国领先的B2B平台,提供了订单详情接口,允许开发者通过订单号获取详细信息,包括订单状态、收货地址、商品列表等。本文介绍如何使用该接口,涵盖注册账号、获取API密钥、安装必要库、构造请求URL、发送HTTP请求、解析响应数据及异常处理等内容,并提供Java示例代码。注意事项包括合规使用、数据安全和高效利用。
|
供应链 安全 物联网
未来已来:新兴技术的融合趋势与创新应用
在数字化浪潮的推动下,新兴技术如区块链、物联网(IoT)、虚拟现实(VR)等正快速融合并重塑我们的世界。本文深入探讨了这些技术如何互相促进,创造出前所未有的应用场景,从而引领着技术发展的新方向。通过分析最新的科研数据和市场报告,我们将揭示这些技术融合背后的驱动力,并预测其在未来可能带来的革命性变化。
334 1
|
移动开发 Unix Linux
Python 遍历文件每一行判断是否只有一个换行符详解
**Python 检查文件每行换行符:** 文章探讨了在Python中验证文件每行是否仅含一个换行符的需求。通过提供代码示例,展示了如何打开文件,遍历行,判断行尾的换行情况。基础实现检查`\n`,扩展版考虑了`\r\n`,并可选地将结果保存至新文件。这些功能有助于确保数据格式规范。
|
缓存 网络协议 算法
网络编程原理
网络编程原理
|
移动开发 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS是两大主导力量。它们各自拥有独特的开发环境和工具,这些差异深刻影响着开发者的决策与应用的性能。本文将深入探讨这两个平台的开发环境,通过比较它们的编程语言、开发工具、用户界面设计及生态系统支持,揭示它们各自的优势与局限。我们旨在为即将踏入移动开发领域的新手提供一个清晰的指南,并激发对移动开发更深层次探索的兴趣。
|
Java 数据安全/隐私保护 Spring
SpringSecurity6从入门到实战之SpringSecurity快速入门
这篇文章是关于使用SpringSecurity 6进行快速入门的教程。首先介绍了所需的环境配置,包括SpringSecurity 6.0.8、SpringBoot 3.0.12和JDK 17。接着,通过步骤展示了如何创建一个新的SpringBoot工程,并添加Web支持。然后,运行工程并测试了Hello接口,确保其正常工作。之后,引入SpringSecurity依赖后,无需额外配置,系统即实现了基础的认证功能,自动重定向到登录页面。文章通过截图详细说明了这个过程,包括控制台日志、登录页面以及登录后的资源访问。
linux内核执行fork时对写时复制的设置
linux内核执行fork时对写时复制的设置
|
数据采集 文字识别 PHP
Python(四十二)百度智能云OCR文字识别的坑
这篇的内容其实跟python的关系不是很大,是在使用python做文字识别的时候遇到的一个坑,这里大概记录一下,希望大家在使用百度智能云的OCR文字识别的时候,能够快速的解决这个问题。 业务需求大概是这个样子的,学生在使用仪器做完实验之后,仪器会将实验结果,打印在一张小票上。正常,学生需要将小票上边的数据,逐一输入到系统中,但是,客户觉得这个操作太麻烦了,想用文字识别将小票上边的数据识别出来,自动填入,学生只需要检查一遍识别的是否正确即可。 需求很简单,我这里的后端是使用PHP做的,这也不耽误我使用python做文字识别。最开始的python文字识别的尝试,我这里就不做赘述了,具体,请
300 0
websphere7.0异常:SRVE0255E: 尚未定义要处理 /wcm 的 Web 组/虚拟主机
websphere7.0异常:SRVE0255E: 尚未定义要处理 /wcm 的 Web 组/虚拟主机
1234 0