原型模式prototype-发送邮件实例

来源:互联网 发布:国内开会软件 编辑:程序博客网 时间:2024/06/08 19:05

  • 模式简介
  • UML
  • 源码下载
  • 题目
  • 代码
  • 运行结果
  • 模式说明
  • C写法

模式简介

Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.

用原型示例指定创建对象的种类,并且通过复制这些原型创建新的对象。

UML

这里写图片描述

源码下载

GitHub:https://github.com/YEN-GitHub/PatternDemo/tree/master/src/CreationalPattern/prototype

题目

王小华群发邮件通知同学参加讲座

代码

package CreationalPattern.prototype.demo1;/** * Created by yangenneng on 2017-05-31 11:20 * Abstract:邮件类 * 必须要实现clone方法 */public class Mail implements Cloneable {    private String receiver;//收件人    private String subject;//邮件标题    private String context;//邮件内容    private String tail;   //邮件尾部    public String getReceiver() {        return receiver;    }    public void setReceiver(String receiver) {        this.receiver = receiver;    }    public String getSubject() {        return subject;    }    public void setSubject(String subject) {        this.subject = subject;    }    public String getContext() {        return context;    }    public void setContext(String context) {        this.context = context;    }    public String getTail() {        return tail;    }    public void setTail(String tail) {        this.tail = tail;    }    public Mail(String subject, String context){        this.subject=subject;        this.context=context;    }    public Mail clone(){        Mail mail=null;        try {            mail= (Mail) super.clone();        } catch (CloneNotSupportedException e) {            e.printStackTrace();        }        return mail;    }}
package CreationalPattern.prototype.demo1;import java.util.LinkedHashMap;/** * Created by yangenneng on 2017-05-31 11:24 * Abstract:客户端测试 */public class Client {    static LinkedHashMap linkedHashMap=new LinkedHashMap();    static {        linkedHashMap.put("张一","1274491995@qq.com");        linkedHashMap.put("张二","2274491995@qq.com");        linkedHashMap.put("张三","3274491995@qq.com");        linkedHashMap.put("张四","4274491995@qq.com");        linkedHashMap.put("张五","5274491995@qq.com");    }    public static void main(String[] args) {        Mail mail=new Mail("参加讲座","2017.06.01参加六一儿童节讲座");        mail.setTail("收到请回复");        for (Object name:linkedHashMap.keySet()){            Mail cloneMali=mail.clone();            cloneMali.setReceiver(name.toString()+" "+linkedHashMap.get(name).toString());            sendMail(cloneMali);        }    }    public static void sendMail(Mail mail){        System.out.println("成功发送邮件:"+"\t标题:"+mail.getSubject()+"\t收件人:"+mail.getReceiver()+"\t内容:"+mail.getContext()+"\t注意:"+mail.getTail());    }}

运行结果

这里写图片描述

模式说明

Java内置了克隆机制,Object类具有一个clone()方法,能够实现对象的克隆,使得一个类支持克隆只需两步骤。

  1. 实现Cloneable接口
  2. 覆盖object的clone()方法,完成对象的克隆操作。为了外部能够访问,可以将访问修饰修改为public.

而要用C++实现的话就相当于是实现深拷贝而已。
如果用C++实现则(因为没有装C++的开发环境,所以只能用java写法模拟):

C++写法

/** * Created by yangenneng on 2017-05-31 11:20 * Abstract:邮件类 * c++写法 */class Mail{    private String receiver;//收件人    private String subject;//邮件标题    private String context;//邮件内容    private String tail;   //邮件尾部    public String getReceiver()    {        return receiver;    }    public void setReceiver(String receiver)    {        this.receiver = receiver;    }    public String getSubject()    {        return subject;    }    public void setSubject(String subject)    {        this.subject = subject;    }    public String getContext()    {        return context;    }    public void setContext(String context)    {        this.context = context;    }    public String getTail()    {        return tail;    }    public void setTail(String tail)    {        this.tail = tail;    }    public Mail(String subject, String context)    {        this.subject=subject;        this.context=context;    }    public Mail clone()    {        Mail mail=new Mail(subject,context);        mail.setReceiver(receiver);        mail.setTail(tail);        return mail;    }}

客户端调用不变。结果也一样。

原创粉丝点击