zoukankan      html  css  js  c++  java
  • 说说设计模式~装饰器模式(Decorator)~多功能消息组件的实现

    返回目录

    为何要设计多功能消息组件

    之前写过一篇装饰器模式的文章,感觉不够深入,这次的例子是实现项目中遇到的,所以把它拿出来,再写写,之前也写过消息组件的文章,主要采用了策略模式实现的,即每个项目可以通过配置进行一种消息的订制,如,你可以订制email,sms,rtx,qq等,但不能同时采用多种机制完成消息的发送,这在一些情况下是没有问题的,但有时,我们也需要同时为客户提供多种消息的推送,这在目前还是挺现时的,如在用户下单后,同时为它发email 和短信进行通过,并对每个订单的过程进行跟踪并通知给用户,这对于用户来说,体验非常不错!

    多功能消息组件的组成

    1 消息元件抽象 MessageComponent

    2 默认的消息实现者DefaultMessage

    3 装饰器抽象 Decorator

    4 实现Email消息的装饰器 EmailDecorator

    5 实现SMS消息的装饰器 SMSDecorator

    下面将部分核心代码公开于世

    using System;
    
    namespace test
    {
        /// <summary>
        /// 消息发送元件
        /// </summary>
        public abstract class MessageComponent
        {
            public abstract void Send (string message);
        }
    
        /// <summary>
        /// 默认实现消息发达,可以记录日志,订阅事件,实现默认的发送消息等功能
        /// </summary>
        public class DefaultMessage:MessageComponent
        {
            public override void Send (string message)
            {
                Console.WriteLine ("默认的消息发送机制");
            }
    
        }
    
        /// <summary>
        /// 对消息发送的装饰,如加个Email发送,SMS发送等
        /// </summary>
        public abstract class Decorator:MessageComponent
        {
            private MessageComponent _messageContaion;
    
            public Decorator (MessageComponent messageContaion)
            {
                _messageContaion = messageContaion;
            }
    
            public override void Send (string message)
            {
    
                if (_messageContaion != null)
                    _messageContaion.Send (message);
            }
        }
    
        /// <summary>
        /// Email消息发送装饰器
        /// </summary>
        public class EmailDecorator:Decorator
        {
            public EmailDecorator () : this (null)
            {
            }
    
            public EmailDecorator (MessageComponent messageContaion) : base (messageContaion)
            {
            }
    
            public override void Send (string message)
            {
                base.Send (message);
                Console.WriteLine ("采用Email发送消息...");
            }
    
        }
    
        /// <summary>
        /// SMS消息发送装饰器
        /// </summary>
        public class SMSDecorator:Decorator
        {
            public SMSDecorator () : this (null)
            {
            }
    
            public SMSDecorator (MessageComponent messageContaion) : base (messageContaion)
            {
            }
    
            public override void Send (string message)
            {
                base.Send (message);
                Console.WriteLine ("采用SMS发送消息...");
            }
    
        }
    }

    调用代码如下:

             MessageComponent defaultMessage = new DefaultMessage ();
                Decorator emailDecorator = new EmailDecorator (defaultMessage);
                Decorator smsDecorator = new SMSDecorator (emailDecorator);//把emailDecorator添加到sms后,同时它集成了defaultMessage
                smsDecorator.Send ("仓储大叔消息组件...");

    结果:

    而如果只希望使用sms发送,那就是:

                Decorator smsDecorator = new SMSDecorator ();
                smsDecorator.Send ("仓储大叔消息组件...");

    希望本文章可以给初学者带来收获,呵呵!

    返回目录

  • 相关阅读:
    poi 导出excel表格
    js 表单非空校验
    表格添加 点击添加增加一列
    date日期比较
    oralce 匿名块 练习
    SQL 入门
    Map集合&&异常处理&&file类
    Properties集合&&工具类FileUtils
    Java中Date类&&Calendar类
    jquery的基础
  • 原文地址:https://www.cnblogs.com/lori/p/4334620.html
Copyright © 2011-2022 走看看