说说设计模式~装饰器模式(Decorator)~多功能消息组件的实现

时间:2022-05-24 00:58:46

返回目录

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

之前写过一篇装饰器模式的文章,感觉不够深入,这次的例子是实现项目中遇到的,所以把它拿出来,再写写,之前也写过消息组件的文章,主要采用了策略模式实现的,即每个项目可以通过配置进行一种消息的订制,如,你可以订制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 ("仓储大叔消息组件...");

结果:

aaarticlea/png;base64,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" alt="" />

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

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

aaarticlea/png;base64,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" alt="" />

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

返回目录