技术开发 频道

原型模式之实战个性化电子账单

  代码清13-4 修正后的邮件类

public class Mail implements Cloneable{    
    
//收件人
    private String receiver;
    
//邮件名称
    private String subject;    
    
//称谓
    private String appellation;    
    
//邮件内容
    private String contxt;    
    
//邮件的尾部,一般都是加上“XXX版权所有”等信息
    private String tail;    
    
//构造函数
    public Mail(AdvTemplate advTemplate){
        
this.contxt = advTemplate.getAdvContext();
        
this.subject = advTemplate.getAdvSubject();
    }
    
    @Override
    public Mail clone(){
        Mail mail
=null;
        
try {
            mail
= (Mail)super.clone();
        }
catch (CloneNotSupportedException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }
        
return mail;
    }

    
    
//以下为getter/setter方法
    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 getAppellation() {
        
return appellation;
    }

    
public void setAppellation(String appellation) {
        
this.appellation = appellation;
    }

    
public String getContxt() {
        
return contxt;
    }

    
public void setContxt(String contxt) {
        
this.contxt = contxt;
    }

    
public String getTail() {
        
return tail;
    }

    
public void setTail(String tail) {
        
this.tail = tail;
    }    
}

  注意看黑体部分,实现了一个接口,并重写了clone方法,大家可能看着这个类有点奇怪,先保留你的好奇,我们继续讲下去,稍后会给你清晰的解答。我们再来看场景Client的变化,如代码清单13-5所示。

  代码清13-5 修正后的场景类

public class Client {
    
//发送账单的数量,这个值是从数据库中获得
    private static int MAX_COUNT = 6;
    
    
public static void main(String[] args) {
        
//模拟发送邮件
        int i=0;
        
//把模板定义出来,这个是从数据中获得
        Mail mail = new Mail(new AdvTemplate());
        mail.setTail(
"XX银行版权所有");
        
while(i<MAX_COUNT){
            
//以下是每封邮件不同的地方
            Mail cloneMail = mail.clone();
            cloneMail.setAppellation(getRandString(
5)+" 先生(女士)");
            cloneMail.setReceiver(getRandString(
5) + "@" + getRandString(8)+".com");            
            
//然后发送邮件
            sendMail(cloneMail);
            i
++;
        }
    }
}

  运行结果不变,一样完成了电子广告信的发送功能,而且sendMail即使是多线程也没有关系。注意看Client类中的黑体字mail.clone()这个方法了吗?把对象拷贝一份,产生一个新的对象,和原有对象一样,然后再修改细节的数据,如设置称谓、设置收件人地址等等。这种不通过new关键字来产生一个对象,而是通过对象拷贝来实现的模式就叫做原型模式。

0
相关文章