码迷,mamicode.com
首页 > 其他好文 > 详细

一个发送邮件的例子------建造模式的应用

时间:2015-08-10 19:50:46      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

假设有一个Java建造的电子杂志系统,定期地向用户的电子邮件信箱发送电子杂志。用户可以通过网页订阅电子杂志,也可以通过网页停止订阅。当用户开始订阅时,系统发送一个电子邮件表示欢迎,当用户结束订阅时,系统发送一个电子邮件表示欢送。本例子就是这个系统负责发送“欢迎”和“欢送”邮件的模块。

在本例中,产品类就是发送给客户的“欢送”和“欢迎”的邮件。由于本例的特殊性,两个产品可以抽象出一个共同的接口,即邮件信息抽象类。下面是该抽象类的源代码

import java.util.Date;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;

/*
 * 抽象的邮件信息类
 * */
public abstract class AutoMessage {
	protected String smtpHost;
	protected String subject="";
	protected String body="";
	protected String from="";
	protected String fromPassword="";
	protected String to="";
	protected Date senDate=null;
	public AutoMessage(){}
	public void send()
	{
		Properties properties = new Properties();
		properties.put("mail.smtp.host", "smtp.qq.com");
        properties.put("mail.sender.username", from);
        properties.put("mail.sender.password", fromPassword);
        Session session = Session.getInstance(properties);
        MimeMessage message = new MimeMessage(session);
        Transport transport=null;
        try {
            // 发件人
            // 下面这个是设置发送人的Nick name
            InternetAddress from = new InternetAddress(MimeUtility.encodeWord("麦芽糖")+" <"+this.from+">");
            message.setFrom(from);
            
            // 收件人
            InternetAddress to = new InternetAddress(this.to);
            message.setRecipient(Message.RecipientType.TO, to);
            
            // 邮件主题
            message.setSubject(this.subject);
            
            
            // 邮件内容,也可以使纯文本"text/plain"
            message.setContent(this.body, "text/html;charset=UTF-8");
            //邮件的发送日期
            message.setSentDate(this.senDate);
            // 保存邮件
            message.saveChanges();
            
            transport = session.getTransport("smtp");
            // smtp验证,就是你用来发邮件的邮箱用户名密码
            transport.connect(this.smtpHost, this.from, this.fromPassword);
            // 发送
            transport.sendMessage(message, message.getAllRecipients());
            //System.out.println("send success!");
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(transport!=null){
                try {
                    transport.close();
                } catch (MessagingException e) {
                    e.printStackTrace();
                }
            }
        }
	}
	public String getSmtpHost() {
		return smtpHost;
	}
	public void setSmtpHost(String smtpHost) {
		this.smtpHost = smtpHost;
	}
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public String getBody() {
		return body;
	}
	public void setBody(String body) {
		this.body = body;
	}
	public String getFrom() {
		return from;
	}
	public void setFrom(String from) {
		this.from = from;
	}
	public String getFromPassword() {
		return fromPassword;
	}
	public void setFromPassword(String fromPassword) {
		this.fromPassword = fromPassword;
	}
	public String getTo() {
		return to;
	}
	public void setTo(String to) {
		this.to = to;
	}
	public Date getSenDate() {
		return senDate;
	}
	public void setSenDate(Date senDate) {
		this.senDate = senDate;
	}
}

 具体的两个邮件信息,源代码

public class GoodbyMessage extends AutoMessage{
	public GoodbyMessage()
	{
		System.out.println("Enter goodby message");
	}
	public void sayGoodby()
	{
		System.out.println("Goodby.");
	}
}


public class WelcomeMessage extends AutoMessage{
	public WelcomeMessage()
	{
		System.out.println("Enter welcome message");
	}
	public void sayWelcome()
	{
		System.out.println("welcome.");
	}
}

 由于电子邮件可以划分为发件人地址、收件人地址、主题、内容等部分(或零件)。因此电子邮件的建造过程可以分为几个零件的建造过程,包括buildTo(),buildFrom(),buildSendDate(),buildSubject(),buildBody()等。我们应该看出,邮件是最终产品,而To,from,date,subject以及邮件内容,则是产品的零件,再添加一个导演者角色,就是一个标准的建造者模式了。

这个系统包含客户端(Client),导演角色(Director),抽象建造者(Builder),具体建造者(WelcomeBuilder,GoodbyeBuilder),产品(WelcomeMessage,GoodbyeMessage)等角色。

/*
 * 导演角色源代码
 * */
public class Director {
	private Builder builder=null;
	public Director(Builder builder)
	{
		this.builder=builder;
	}
	public void construct(String smtpHost,String from,String fromPassword,String to)
	{
		builder.buildSmtpHost(smtpHost);
		builder.buildFrom(from);
		builder.buildFromPassword(fromPassword);
		builder.buildBody();
		builder.buildObject();
		builder.buildTo(to);
		builder.buildDate();
		builder.sendMail();
	}
}

 

/*
 * 抽象构建者源代码
 * */
import java.util.Date;

public abstract class Builder {
	protected AutoMessage msg;
	public Builder(){}
	/*
	 * 发送邮件的主机零件构建方法
	 * */
	public void buildSmtpHost(String smtpHost)
	{
		msg.setSmtpHost(smtpHost);
	}
	/*
	 * 发件人地址的零件构建方法
	 * */
	public void buildFrom(String from){
		msg.setFrom(from);
	}
	/*
	 * 发件人密码零件构建方法
	 * */
	public void buildFromPassword(String fromPassword)
	{
		msg.setFromPassword(fromPassword);
	}
	/*
	 * 收件人地址零件构建方法
	 * */
	public void buildTo(String to){
		msg.setTo(to);
	}
	/*
	 * 发送时间零件的构建方法
	 * */
	public void buildDate()
	{
		msg.setSenDate(new Date());
	}
	/*
	 * 邮件主题零件的构造方法
	 * */
	public abstract void buildObject();
	/*
	 * 邮件内容零件的构造方法
	 * */
	public abstract void buildBody();
	/*
	 * 产品完成以后,用此方法发送邮件
	 * */
	public void sendMail()
	{
		msg.send();
	}
}

 

/*
 * 具体构建者源代码
 * */
public class WelcomeBuilder extends Builder{
	public WelcomeBuilder()
	{
		msg=new WelcomeMessage();
	}

	@Override
	public void buildObject() {
		// TODO Auto-generated method stub
		String object="welcome";
		msg.setSubject(object);
		
	}

	@Override
	public void buildBody() {
		// TODO Auto-generated method stub
		String body="welcome";
		msg.setBody(body);
		
	}
}


public class GoodbyeBuilder extends Builder {
	public GoodbyeBuilder()
	{
		msg=new GoodbyMessage();
	}

	@Override
	public void buildObject() {
		// TODO Auto-generated method stub
		String object="ByeBye";
		msg.setSubject(object);
		
	}

	@Override
	public void buildBody() {
		// TODO Auto-generated method stub
		String body="ByeBye";
		msg.setBody(body);
		
	}
}

 

public class Client {
	public static void main(String[] args) {
		Builder welcomeBuilder=new WelcomeBuilder();
		Director director=new Director(welcomeBuilder);
//参数依次为,邮件服务器地址,发送邮件的地址,发送邮件的密码,接收邮件的地址 director.construct("smtp.qq.com", "XXXXXXXXX@qq.com", "************", "XXXXXXXXXXXX@qq.com"); } }

 

一个发送邮件的例子------建造模式的应用

标签:

原文地址:http://www.cnblogs.com/xtsylc/p/4718396.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!