天龙八部之策略模式歪传

大锤最近在家抄《天龙八部》,关于段誉这个人物走向,开头和结尾都抄好了,就是段誉如何得到王语嫣的真心这段不知道怎么写,观众才喜欢看,便瞎写道:段誉死缠烂打,天天像个跟屁虫一样。这样写完后,拿给编辑看,编辑看了立即摇头,“不行啊,观众肯定不买帐,回去再修改下。”

当晚,编辑在床上辗转反侧,觉得好好的一部《天龙八部》会不会被大锤抄成烂剧,烂书,没人看?越想越糟心,起床,喝了点茅台,渐渐地,开始迷迷糊糊,眼前的景色突然一晃,好像来到了一个陌生的地方,满地荒芜,乱世林立,其中有一块大石头上刻着一堆不认识的文字:

In computer programming, the strategy pattern (also known as the policy pattern) is a behavioral software design pattern that enables selecting an algorithm at runtime. Instead of implementing a single algorithm directly, code receives run-time instructions as to which in a family of algorithms to use.

文字下面还有一个奇怪的形状:

strategy pattern

编辑心中疑惑,难道这里是雁门关外?乔峰父母遇害的地方?石头上的文字就是乔峰他爹跳崖前写下的契丹文?想完便默默记下其中的内容。

第二天起床的时候,编辑闭着眼睛回忆昨晚喝醉后遇到的情形,默写出那段奇怪文字,上街四处打听,终于找到几个认识此文字的人,叫人翻译出来,大致意思为:

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

编辑回家望着这段话,不禁陷入了沉思。。。

另外一边,大锤无奈回家想了一天一夜都没有想出来,就把慕容复这个角色删掉了,然后拿给编辑看,编辑又说,“你这样更不行啊,把慕容复删掉了,剧情又少了一大半,得不偿失啊!”,没办法,大锤只能回家继续改。

回到家后,大锤把那本删掉(撕掉的)稿纸又粘回去,把原先死缠烂打那部分用小米签字笔涂掉,反反复复,不知道该怎么写,突然,外面来人说编辑送来了一幅海报,大锤心中暗喜:难道编辑给我指点来了?便匆忙打开一开,原来是:

“mmp!”,大锤心中冒出这三个字母,四个字符,虽然不知道什么意思。过了一个月,大锤终于想了一个绝好的英雄救美的经历写在破损不堪的原文处并送给了编辑。编辑拿到看后大喜,不过突然又不高兴了,说,“你这个稿纸又撕又粘又涂又改的,不行啊,来,我最近得天人相助,悟出了一点东西,正好教你!”,说着就打开Macbook Pro的IDEA,开始写到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public abstract class Strategy {
/**
* 段誉如何得到王语嫣的心
*/
abstract void getLove();
}

class ConcreteStrategy1 extends Strategy{

@Override
void getLove() {
System.out.println("段誉就死缠烂打,天天像个跟屁虫一样;");
}
}

class ConcreteStrategy2 extends Strategy{

@Override
void getLove() {
//大锤直接把慕容复删掉了
System.out.println("两人一见钟情;");
}
}

class ConcreteStrategy3 extends Strategy{

@Override
void getLove() {
System.out.println("每天远远地跟在王语嫣身后,终于在一个夜深人静的夜晚把王语嫣...(嘿嘿嘿,别想歪了)...从她表哥的手上救了下来,真正的得到了她的心;");
}
}

编辑顿了顿,把手从背后伸进了内裤,挠了挠屁股,喃喃自语,“像这样封装起来多好啊”,挠完了继续敲打着键盘:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Context {

private Strategy mStrategy;

public static void main(String[] args) {
System.out.println("段誉自从在无量山洞里面见了神仙姐姐后,就茶不思,饭不想,终于在燕子坞见到了'神仙姐姐';");

Context context = new Context();
context.setStrategy(new ConcreteStrategy3());
context.getLove();

System.out.println("从此段誉和王语嫣过上了幸福的生活。");
}

public void setStrategy(Strategy strategy) {
mStrategy = strategy;
}

public void getLove() {
mStrategy.getLove();
}
}

写完后,编辑满意地点了点头,抓起大锤的小手,一起按下回车键,按下那一刻,黑色命令行屏幕突然冒出一束金光:

1
2
3
段誉自从在无量山洞里面见了神仙姐姐后,就茶不思,饭不想,终于在燕子坞见到了'神仙姐姐';
每天远远地跟在王语嫣身后,终于在一个夜深人静的夜晚把王语嫣...(嘿嘿嘿,别想歪了)...从她表哥的手上救了下来,真正的得到了她的心;
从此段誉和王语嫣过上了幸福的生活。

编辑含情脉脉地低头望着怀里的大锤,说,“这个叫做策略模式,就是说,如果这本小说想编入小学生的书本里面,我们一定要删减,不能让小孩子看到太多影响他们成长的东西,这里改下context.setStrategy(new ConcreteStrategy2());,假如最后一种策略不符合广电总局的社会主义价值观的审核要求,那就简单改成第一种策略,context.setStrategy(new ConcreteStrategy1());

编辑停下来吸了口哇哈哈,继续说道,“你知道这样写有什么好处吗?算了,你先回去吧,小傻瓜,说了你暂时也不会懂的。”

第二天,大锤兴高采烈地到编辑的办公室,找编辑讨论点事情,刚推开办公室的门,就看到编辑倒在一滩血泊中,旁边是用血迹歪歪扭扭的写着两行字:

《Android源码设计模式解析与实战》

Strategy pattern

两行字的后面还有一大滩血,大锤凑近一看,还是用血写成的字:

策略模式主要用来分离算法,在相同的行为抽象下有不同的具体实现策略。这个模式很好地演示了开闭原则,也就是定义抽象,注入不同的实现,从而达到很好的扩展性。

优点

  • 策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。
  • 策略模式提供了管理相关的算法族的办法。
  • 策略模式提供了可以替换继承关系的办法。
  • 使用策略模式可以避免使用多重条件转移语句。

缺点

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
  • 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。

究竟编辑是如何死的?大锤完全没有头绪…

(完)

评论留言请点这里