1700479292
33.1 策略模式VS桥梁模式
1700479293
1700479294
这对冤家终于碰头了,策略模式与桥梁模式是如此相似,简直就是孪生兄弟,要把它们两个分开可不太容易。我们来看看两者的通用类图,如图33-1所示。
1700479295
1700479296
1700479297
1700479298
1700479299
图33-1 策略模式(左)和桥梁模式(右)通用类图
1700479300
1700479301
两者之间确实很相似。如果把策略模式的环境角色变更为一个抽象类加一个实现类,或者桥梁模式的抽象角色未实现,只有修正抽象化角色,想想看,这两个类图有什么地方不一样?完全一样!正是由于类似场景的存在才导致了两者在实际应用中经常混淆的情况发生,我们来举例说明两者有何差别。
1700479302
1700479303
大家都知道邮件有两种格式:文本邮件(Text Mail)和超文本邮件(HTML MaiL),在文本邮件中只能有简单的文字信息,而在超文本邮件中可以有复杂文字(带有颜色、字体等属性)、图片、视频等,如果你使用Foxmail邮件客户端的话就应该有深刻体验,看到一份邮件,怎么没内容?原来是你忘记点击那个“HTML邮件”标签了。下面我们就来讲解如何发送这两种不同格式的邮件,研究一下这两种模式如何处理这样的场景。
1700479304
1700479305
33.1.1 策略模式实现邮件发送
1700479306
1700479307
使用策略模式发送邮件,我们认为这两种邮件是两种不同的封装格式,给定了发件人、收件人、标题、内容的一封邮件,按照两种不同的格式分别进行封装,然后发送之。按照这样的分析,我们发现邮件的两种不同封装格式就是两种不同的算法,具体到策略模式就是两种不同策略,这样看已经很简单了,我们可以直接套用策略模式来实现。先看类图,如图33-2所示。
1700479308
1700479309
1700479310
1700479311
1700479312
图33-2 策略模式实现邮件发送的类图
1700479313
1700479314
我们定义了一个邮件模板,它有两个实现类:TextMail(文本邮件)和HtmlMail(超文本邮件),分别实现两种不同格式的邮件封装。MailServer是一个环境角色,它接收一个MailTemplate对象,然后通过sendMail方法发送出去。我们来看具体的代码,先看抽象邮件,如代码清单33-1所示。
1700479315
1700479316
代码清单33-1 抽象邮件
1700479317
1700479318
public abstract class MailTemplate{
1700479319
1700479320
//邮件发件人
1700479321
1700479322
private String from;
1700479323
1700479324
//收件人
1700479325
1700479326
private String to;
1700479327
1700479328
//邮件标题
1700479329
1700479330
private String subject;
1700479331
1700479332
//邮件内容
1700479333
1700479334
private String context;
1700479335
1700479336
//通过构造函数传递邮件信息
1700479337
1700479338
public MailTemplate(String_from,String_to,String_subject,String
1700479339
1700479340
_context){
[
上一页 ]
[ :1.700479291e+09 ]
[
下一页 ]