29.1 策略模式 VS 桥梁模式

29.1.1 策略模式

【编程实验】用策略模式实现邮件发送

第29章 跨战区大PK

(1)有文本和超文本两种格式的邮件,将这两种格式封装成两种不同的发送策略

(2)文本邮件和超文本邮件分别是两种不同格式的邮件的封装。MailServer是一个环境角色,它接收一个MailTemplate对象,并通过sendMail方法将邮件发送出去。

//跨战区大PK——策略模式和桥接模式
//实例:用策略模式实现邮件发送
#include <iostream>
#include <string>

using namespace std;

//抽象邮件
class MailTemplate
{
protected:
    string from;   //邮件发件人
    string to;      //收件人
    string subject; //邮件标题
protected:
    string context; //邮件内容
public:
    MailTemplate(string from, string to,
                 string subject, string context)
    {
        this->from = from;
        this->to = to;
        this->subject = subject;
        this->context = context;
    }

    string getFrom(){return from;}
    void setFrom(string value){from = value;}

    string getTo(){return to;}
    void setTo(string value){to = value;}

    string getSubject(){return subject;}
    void setSubject(string value){subject = value;}

    void setContext(string value){context = value;}
    virtual  string getContext() = 0;
};

//文本邮件
class TextMail : public MailTemplate
{
public:
    TextMail(string from, string to,
            string subject, string context):MailTemplate(from, to, subject, context)
    {
    }

    string getContext()
    {
        //文本类型设置邮件的格式为text/plain
        context = "\n  Context-type: text/plain;charset=GB2312\n"
                  + context;
        //同时对邮件进行base64编码处理,这里用一句话代替
        context +=  "\n邮件格式为:文本格式";
        return context;
    }
};

//超文本邮件
class HtmlMail : public MailTemplate
{
public:
    HtmlMail(string from, string to,
            string subject, string context):MailTemplate(from, to, subject, context)
    {
    }

    string getContext()
    {
        //超文本类型设置邮件的格式为multipart/mixed
        context = "\n  Context-type: multipart/mixed;charset=GB2312\n"
                  + context;
        //同时对邮件进行HTML检查,是否有类似未关闭的标答
        context +=  "\n邮件格式为:超文本格式";
        return context;
    }
};

//邮件服务器(环境角色类)
class MailServer
{
private:
    MailTemplate* mail;
public:
    MailServer(MailTemplate& mt)
    {
        mail = &mt;
    }

    //发送邮件
    void sendMail()
    {
        cout << "====正在发送的邮件信息====" << endl;
        //发件人
        cout << "发件人:" << mail->getFrom()<< endl;
        //收件人
        cout << "收件人:" << mail->getTo()<< endl;
        //邮件标题
        cout << "邮件标题:" << mail->getSubject()<< endl;
        //邮件内容
        cout << "邮件内容:" << mail->getContext()<< endl;
    }
};

int main()
{
    //创建一封超文本格式的邮件
    MailTemplate* txtMail = new HtmlMail("a@a.com", "b@b.com",
                    "外星人攻击地球了", "结局是外星人被地球人打败了!");
    //创建邮件服务器
    MailServer mailServ(*txtMail);
    //发送邮件
    mailServ.sendMail();


    return 0;
};
/*输出结果:
====正在发送的邮件信息====
发件人:a@a.com
收件人:b@b.com
邮件标题:外星人攻击地球了
邮件内容:
  Context-type: multipart/mixed;charset=GB2312
结局是外星人被地球人打败了!
邮件格式为:超文本格式
*/
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-05-28
  • 2022-12-23
  • 2021-07-20
  • 2021-08-19
  • 2021-07-28
  • 2021-06-30
猜你喜欢
  • 2021-09-22
  • 2021-08-05
  • 2021-08-13
  • 2021-12-13
  • 2022-02-07
  • 2021-08-14
相关资源
相似解决方案