您的位置:首页 > 其它

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

2015-03-13 11:27 696 查看
返回目录

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

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




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

返回目录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: