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

假设有一个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", "[email protected]", "************", "[email protected]");
	}
}
时间: 2024-10-02 16:20:26

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

《JAVA与模式》之建造模式

在阎宏博士的<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 产品的内部表象 一个产品常有不同的组成成分作为产品的零件,这些零件有可能是对象,也有可能不是对象,它们通常又叫做产品的内部表象(internal representation).不同的产品可以有不同的内部表象,也就是不同的零

JAVA设计模式之建造模式

在阎宏博士的<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 产品的内部表象 一个产品常有不同的组成成分作为产品的零件,这些零件有可能是对象,也有可能不是对象,它们通常又叫做产品的内部表象(internal representation).不同的产品可以有不同的内部表象,也就是不同的零

【设计模式】建造模式

引子 前几天陪朋友去装机店攒了一台电脑,看着装机工在那里熟练的装配着机器. 作为装机工,他们不用管你用的 CPU 是 Intel 还是 AMD,也不管你的显卡是 2000 千大元还是白送的,都能三下五除二的装配在一起. 一台 PC 就诞生了! 当然对于客户来说,你也不知道太多关于 PC 组装的细节. 这和建造模式是多么的相像啊! 定义与结构 GOF 给建造模式的定义为:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 这句话说得很抽象,不好理解,其实它的意思可以理解为:

设计模式之七:建造模式(Builder Pattern)

建造者模式就是将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示. 适用范围: 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. 当构造过程必须允许被构造的对象有不同表示时. 建造者模式里面有四个角色: Builder: 给出一个抽象接口,以规范产品对象的各个组成部分的建造.一般而言,此接口独立于应用程序的业务逻辑.模式中直接创建产品对象的具体创建者角色.具体创建者角色必须实现这个接口的所有方法:一个是建造方法,另一个是结果返还方法. ConcreteBu

设计模式:建造模式

原文地址:http://leihuang.org/2014/12/03/builder/ Creational 模式 物件的产生需要消耗系统资源,所以如何有效率的产生.管理 与操作物件,一直都是值得讨论的课题, Creational 模式即与物件的建立相关,在这个分类下的模式给出了一些指导原则及设计的方向.下面列举到的全属于Creational 模式 Simple Factory 模式 Abstract Factory 模式 Builder 模式 Factory Method 模式 Protot

设计模式笔记——建造模式

定义:讲一个复杂对象的构建与它的表示相分离,使得同样的构建过程可以创建不同的表示.  将构造复杂对象的过程和组成对象的部件解耦 使用情况,满足以下条件可以考虑使用建造模式搭建框架: 1.产品有复杂的内部结构 2.系统中对此产品的需求将来可能改变产品对象的内部结构构成 3.不能将产品的内部构造完全暴漏给客户,一是为了可用性,二是为了安全因素 建造模式的组成: 1.抽象建造者角色(Builder):用来规范产品对象的哥哥组成成分的建造.一般而言,此角色独立于应用程序的业务逻辑. 2. 具体建造角色(

【Python】一个简单的例子

问题描述: Python基础篇 参考资料: (1)http://www.cnblogs.com/octobershiner/archive/2012/12/04/2801670.html (2)http://www.cnblogs.com/itech/archive/2010/06/20/1760345.html 例子: 求解Fibonacci glb_var.py gl_count=1 path.py # coding:utf-8 ''' Created on 2014-4-28 @autho

建造模式

建造模式将一个产品的内部表象与产品的生成过程分割开来,从而使一个建造过程可以生成具有不同内部表象的产品对象. public class Director { public void construct(){                 Builder builder1 = new ConcreteBuilder1();                 builder1.buildPart1();                 builder1.buildPart2();         

javamail 发送邮件简单例子

前几天,做预警项目需要添加一个发送邮件的功能,由于本人刚刚接触java,还不甚懂.网上找了一个例子,略加修改,即完成………… 例子地址:http://www.blogjava.net/wangfun/archive/2009/04/15/265748.html 下面开始一步步来讲(大牛勿喷~~): step1. 下载jar包:javax.mail:mail:1.4.7,当然,如果你是用的gradle那就直接在build.gradle中添加compile 'javax.mail:mail:1.4.