首页 > 其他分享 >[设计模式] 装饰器模式

[设计模式] 装饰器模式

时间:2022-12-05 17:58:14浏览次数:50  
标签:模式 装饰 IUserService User new 设计模式 RegisterUser public user

一、装饰器模式

  在软件开发过程中,由于需求的改动,可能面临对某个或某些对象新增一些新的功能的需求。根据开闭原则,新增功能我们也不能直接去修改

原有的类,而如果使用继承的方式去实现,可能出现“子类爆炸”的问题,这个时候就可以使用到 装饰器模式。

  装饰器模式:允许向一个现有的对象添加新的功能,同时又不改变这个现有对象的结构。属于结构型设计模式,它是作为现有类的一种包装。

首先会创建一个装饰类,用来包装原有的类,并在保持类的完整性的前提下,提供额外的功能。

1.首先创建一个User类 

public class User
{
    public string UserName{get;set;}
    public string Password{get;set;}
}

 

2.创建一个用户服务接口IUserService,里面有一个RegisterUser方法用来注册一个用户

public interface IUserService
{
    void RegisterUser(User user);
}    

3.创建一个类实现IUserService接口

public class UserService:IUserService
{
    public void RegisterUser(User user)
    {
        Console.WriteLine($"{user.UserName}注册成功");
    }
}        

4.在控制台Main方法中调用

class Program
    {
        static void Main(string[] args)
        {
            IUserService service = new UserService();
            var user = new User("jyq", "123456");
            service.RegisterUser(user);
            Console.ReadKey();
        }
    }

  运行结果:

5.现在要新增一个需求,要求在注册成功之后打印日志。这时我们再创建一个装饰器类:UserDecorator

public class UserDecorator : IUserService
    {
        private readonly IUserService _userService;

        public UserDecorator(IUserService userService)
        {
            _userService = userService;
        }
        public void RegisterUser(User user)
        {
            _userService.RegisterUser(user);

            var path = Environment.CurrentDirectory + "\\log.txt";
            using(var stream = new FileStream(path, FileMode.OpenOrCreate,FileAccess.Write))
            {
                string msg = $"{DateTime.UtcNow:d}:{user.UserName}注册成功";
                byte[] buffer = Encoding.UTF8.GetBytes(msg);
                stream.Write(buffer, 0, buffer.Length);
                stream.Close();
            }
        }
    }

6.在Main函数中调用就变成了这样 

class Program
    {
        static void Main(string[] args)
        {
            IUserService service = new UserService();
            var user = new User("jyq", "123456");
            var decorator = new UserDecorator(service);
            decorator.RegisterUser(user);
            Console.ReadKey();
        }
    }

7.看一下执行结果

  这样就通过装饰器模式在不改变原有对象结构的前提下实现了新的需求功能。

9.结束

  以上就是本次的全部内容,通过一个简单的案例讲解了一下装饰器模式。如有不同见解,可以评论一起探讨。

标签:模式,装饰,IUserService,User,new,设计模式,RegisterUser,public,user
From: https://www.cnblogs.com/jyq0920/p/16952812.html

相关文章

  • 【设计模式】——你真的会单例吗?
    【简介】单例模式,属于创建类型的一种常用的​​软件设计​​模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文......
  • 最新版gym-0.26.2中Atari环境下各游戏在不同模式和困难度下的遍历
    相关内容参看前文:​​最新版gym-0.26.2下Atari环境的安装以及环境版本v0,v4,v5的说明​​  =========================================== gym中Atari游戏共收录62个游戏,具......
  • 代理,装饰,适配,桥接,面孔的区别
    代理,装饰,适配,桥接,面孔的区别Proxy couldbeusedwhenyouwanttolazy-instantiateanobject,orhidethefactthatyou'recallingaremoteservice,orcontrol......
  • 你的职责链模式符合五大原则吗?-系统学习九
    一、背景介绍工作之余对于用到的设计模式进行总结再梳理,发现职责链模式的妙处以及五大原则的指导下更能发挥职责链模式的优势于是乎便有了这篇博文的诞生阅读这篇文章会让小......
  • PowerBuilder编程新思维6:装饰(用最简单的方式做框架)
     Tobe,ornottobe-thatisthequestion. PowerBuilder编程新思维6:装饰(用最简单的方式做框架) 问题这一章,是写得最艰难的一章,原因有四:一、WUI的范畴实在太......
  • 单例设计模式
    单例设计模式什么是单例设计模式所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个实例对象,并且该类只提供一个取得其对象实例的方......
  • 软件设计模式之模拟游角色选择(Darren建造者模式)
    o(︶︿︶)o唉,今天的状态不是很好,但是学习还是要继续的,今天和大家一起分享一下建造者模式,记得之前自己之前一直再想QQ秀换装是怎么是怎么是实现的,今天看了建造者模式我明白了........
  • 软件设计模式之外观设计模式(Darren)
    先回顾一下之前我们已经讲过的设计模式:简单工厂模式,策略模式,单一职责原则,开放封闭原则,依赖倒转原则,装饰模式,抽象工厂模式,模板方法模式,迪米特法则;今天我们来讲一下......
  • Web前端开发中的MCRV模式
     摘要针对前端开发中基于ajax的复杂页面开发所面临的代码规模大,难以组织和维护,代码复用性、扩展性和适应性差等问题,本文尝试以MVC思想为基础,结合Web前端开发中“内容......
  • Selenium4+Python3系列(十) - Page Object设计模式
    前言​​PageObject(PO)​​​模式,是​​Selenium​​实战中最为流行,并且被自动化测试同学所熟悉和推崇的一种设计模式之一。在设计测试时,把页面元素定位和元素操作方法按照......