策略模式 | 桥梁模式 |
---|---|
MailTemplate
package com.peng.kzq1;
/**
* @author kungfu~peng
* @data 2017年12月27日
* @description
*/
public abstract class MailTemplate {
// 邮件发件人
private String from;
// 邮件收件人
private String to;
// 邮件标题
private String subject;
// 邮件内容
private String context;
// 通过构造函数传递邮件信息
public MailTemplate(String from, String to, String subject, String context) {
super();
this.from = from;
this.to = to;
this.subject = subject;
this.context = context;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
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;
}
}
TextMail
package com.peng.kzq1;
/**
* @author kungfu~peng
* @data 2017年12月27日
* @description
*/
public class TextMail extends MailTemplate {
public TextMail(String from, String to, String subject, String context) {
super(from, to, subject, context);
}
public String getContext() {
// 文本类型设置的格式为:text/plain
String context = "\nContent-Type:text/plain;charset=GB2312\n"
+ super.getContext();
// 同时对邮件进行base64编码处理,这里用一句话代替
context = context + "\n邮件格式为:文本格式";
return context;
}
}
HtmlMail
package com.peng.kzq1;
/**
* @author kungfu~peng
* @data 2017年12月27日
* @description
*/
public class HtmlMail extends MailTemplate {
public HtmlMail(String from, String to, String subject, String context) {
super(from, to, subject, context);
}
public String getContext() {
// 文本类型设置的格式为:text/plain
String context = "\nContent-Type:multipart/mixed;charset=GB2312\n"
+ super.getContext();
// 同时对邮件进行base64编码处理,这里用一句话代替
context = context + "\n邮件格式为:超文本格式";
return context;
}
}
MailServer
package com.peng.kzq1;
/**
* @author kungfu~peng
* @data 2017年12月27日
* @description
*/
public class MailServer {
// 发送的是哪封邮件
private MailTemplate m;
public MailServer(MailTemplate m) {
super();
this.m = m;
}
// 发送邮件
public void sendMail() {
System.out.println("=====正在发送的邮件信息=====");
// 发件人
System.out.println(m.getFrom());
// 收件人
System.out.println(m.getTo());
// 标题
System.out.println("邮件标题:" + m.getSubject());
// 邮件内容
System.out.println("邮件内容:" + m.getContext());
}
}
Client
package com.peng.kzq1;
/**
* @author kungfu~peng
* @data 2017年12月27日
* @description
*/
public class Client {
public static void main(String[] args) {
// 创建一封TEXT格式的邮件
MailTemplate m = new HtmlMail("[email protected]", "[email protected]", "外星人攻击地球了!",
"结局:外星人被地球人打回老家了");
MailServer ms = new MailServer(m);
ms.sendMail();
}
}
执行结果
=====正在发送的邮件信息=====
[email protected]
[email protected]
邮件标题:外星人攻击地球了!
邮件内容:
Content-Type:multipart/mixed;charset=GB2312
结局:外星人被地球人打回老家了
邮件格式为:超文本格式
MailTemplate
package com.peng.kzq2;
/**
* @author kungfu~peng
* @data 2017年12月27日
* @description
*/
public abstract class MailTemplate {
// 邮件发件人
private String from;
// 邮件收件人
private String to;
// 邮件标题
private String subject;
// 邮件内容
private String context;
// 允许增加邮件发送标志
public void add(String sendInfo) {
context = sendInfo + context;
}
// 通过构造函数传递邮件信息
public MailTemplate(String from, String to, String subject, String context) {
super();
this.from = from;
this.to = to;
this.subject = subject;
this.context = context;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
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;
}
}
HtmlMail
package com.peng.kzq2;
/**
* @author kungfu~peng
* @data 2017年12月27日
* @description
*/
public class HtmlMail extends MailTemplate {
public HtmlMail(String from, String to, String subject, String context) {
super(from, to, subject, context);
}
public String getContext() {
// 文本类型设置的格式为:text/plain
String context = "\nContent-Type:multipart/mixed;charset=GB2312\n"
+ super.getContext();
// 同时对邮件进行base64编码处理,这里用一句话代替
context = context + "\n邮件格式为:超文本格式";
return context;
}
}
TextMail
package com.peng.kzq2;
/**
* @author kungfu~peng
* @data 2017年12月27日
* @description
*/
public class TextMail extends MailTemplate {
public TextMail(String from, String to, String subject, String context) {
super(from, to, subject, context);
}
public String getContext() {
// 文本类型设置的格式为:text/plain
String context = "\nContent-Type:text/plain;charset=GB2312\n"
+ super.getContext();
// 同时对邮件进行base64编码处理,这里用一句话代替
context = context + "\n邮件格式为:文本格式";
return context;
}
}
MailServer
package com.peng.kzq2;
/**
* @author kungfu~peng
* @data 2017年12月27日
* @description
*/
public abstract class MailServer {
// 发送的是哪封邮件
protected MailTemplate m;
public MailServer(MailTemplate m) {
super();
this.m = m;
}
// 发送邮件
public void sendMail() {
System.out.println("=====正在发送的邮件信息=====");
// 发件人
System.out.println(m.getFrom());
// 收件人
System.out.println(m.getTo());
// 标题
System.out.println("邮件标题:" + m.getSubject());
// 邮件内容
System.out.println("邮件内容:" + m.getContext());
}
}
Postfix
package com.peng.kzq2;
/**
* @author kungfu~peng
* @data 2017年12月27日
* @description
*/
public class Postfix extends MailServer {
public Postfix(MailTemplate m) {
super(m);
}
// 修正邮件发送程序
public void sendMail() {
String context = "Received:from xxx(ooxx) by aaa.aaaa.aaa.com(Postfix) with ESMT id asd12345\n";
super.m.add(context);
super.sendMail();
}
}
SendEmail
package com.peng.kzq2;
/**
* @author kungfu~peng
* @data 2017年12月27日
* @description
*/
public class SendEmail extends MailServer {
public SendEmail(MailTemplate m) {
super(m);
}
// 修正邮件发送程序
public void sendMail() {
String context = "Received:from xxx(ooxx) by aaa.aaaa.aaa.com(SendEmail) with ESMT id 6666666 2017.5.28\n";
super.m.add(context);
super.sendMail();
}
}
Client
com.peng.kzq2;
/**
* @author kungfu~peng
* @data 2017年12月27日
* @description
*/
public class Client {
public static void main(String[] args) {
// 创建一封TEXT格式的邮件
MailTemplate m = new HtmlMail("[email protected]", "[email protected]", "外星人攻击地球了!",
"结局:外星人被地球人打回老家了");
MailServer ms = new Postfix(m);
ms.sendMail();
}
}
执行结果
=====正在发送的邮件信息=====
[email protected]
[email protected]
邮件标题:外星人攻击地球了!
邮件内容:
Content-Type:multipart/mixed;charset=GB2312
Received:from xxx(ooxx) by aaa.aaaa.aaa.com(Postfix) with ESMT id asd12345
结局:外星人被地球人打回老家了
邮件格式为:超文本格式
比较项 | 策略模式 | 桥梁模式 |
---|---|---|
行为模式,旨在封装一系列行为,在例子中我们认为、把邮件的必要信息(发件人、收件人、标题、内容)封装成一个对象就是一个行为,封装的个格式不同,行为也就不同 | 桥梁模式则是解决不破坏封装性的情况下如何抽取出他们的地抽象部分和部分实现部分都可以独立的变化,在例子中,我们的邮件服务器和邮件模板是不是都可以独立的变化?不管是邮件服务器还是邮件模型,只要继承了抽象类就可以继续扩展,它的主旨是建立一个不破坏封装性的可扩展性架构 | |
实现的方式 | 继承+多态 | 不破坏封装的前提下解决抽象和实现都可以独立扩展的模式--抽象化角色和实现化角色 |