设计模式之旅(二)--策略模式

开启我们的木叶村之旅了,来到木叶村,发现这里大家讨论最多的一个词,不是火影(虽然鸣人天天喊),而是宇智波。。。

一个充满神秘的战斗种族!

那我们先来了解一些宇智波这一族吧

他们叫 Uchiha(宇智波),他们都精通一种基本忍术是 sayHi(),在富岳一家,有两兄弟,大哥是Itachi(鼬),二哥...是sasuke(佐助)

他们都继承了宇智波一族的基本忍术sayHi()就像下面这样子:


这是宇智波之神给自己的子孙们设计的类图,嗯,远古时代的确有点简陋,这么强大的宇智波一族,竟然仅仅会sayHi()这一个忍术....

但是,后来呢,宇智波一族发展起来了,大家都学会了火遁(katon),这时,宇智波之神,想了一下,好吧,虽然有点麻烦,但这么个小问题,还是难不倒聪明的宇智波之神的,然后,他就将子孙图给改了,成了现在这个样子:



所有的宇智波的后人们,都实现katon这个方法,虽然有点麻烦,但是这样还是能够解决问题的,先将就这用吧


可是,随着族人能力的发展,渐渐的有部分不安分的族人,又学会了一些新的忍术,而且,还有的竟然开写轮眼了-_-,现在Itachi掌握了写轮眼(Syaringan)这个忍术,但是呢,佐助还不会

宇智波之神现在就在思考,那应该怎么办呢,如何来规划发展族人呢,难道说可以这样吗?


佐助的syaringan是doNothing()的,那么这样好像就解决问题。。but ,毕竟这是宇智波之神在做决策,是在做一族繁衍之决策,怎么可以这样不优雅呢,宇智波可是有成千上万的人,说不定其他人也会开写轮眼,说不定有部分人的写轮眼的能力是一样的,都是天照啥的,我们这样做,要为每个族人都准备一个写轮眼,而且很可能有巨多写轮眼的能力是一样的,但我们仍然坚持一对一服务...好吧,就算自己觉不出笨,相信日向他们白眼一族也会笑掉大牙的

那么,应该怎么办呢?

好,这是宇智波之神,走进宇智波密室,进行冥思。

这个问题的关键是什么,是变化,但是同时他也有未变化之处,哪里变化呢?有的人掌握写轮眼(syaringan)方法,有的人不掌握写轮眼方法;哪里是不变化的呢,有很多人的写轮眼的能力是一样的,这是不变的。

那么,该怎么办呢?

将变化之处,抽象分离出来,并将它们封印(好吧,应该是封装)起来,使他们不受其他部分的影响。



这时,宇智波之神,又想到了一点,他们族人的这个火遁,还有写轮眼的能力都是各不相同的啊,万一在不断升级的过程中,个人能力改变,学会了更高级别的火遁或者写轮眼,哪应该怎么办呢?

如果我们这样做,我们的设计,那也太没有弹性了吧。我们想要的是,可以给族人指定一个技能,而且,在其日后升级之后,可以改变其技能,但是,发招的步骤还是一样的,还是调用同样的方法来出招。

突然间,宇智波之神想起了,上课时,老师好像说过接口这个概念,对对对,针对接口编程,而不是针对实现编程,将同一种忍术抽象出来,无论以后调用哪种级别的术,都可以通过调用同一种方法来使用,而且还可以动态改变忍术。想想就很棒

还不理解?!

好吧,这样:

//针对实现编程
Dog dog = new Dog();
dog.bark;

//针对接口编程
Animal dog = new Dog();
dog.makeSound();

类图是这样子的:


好,针对接口编程就扯这么多


那么到此宇智波之神就可以考虑重新设计自己的族人了。。。

不罗嗦了,宇智波之神愤怒之后,智力大增,瞬间将设计完成了,下面这样子:


Has-A是“有一个”的意思,通常来说,是某个类保存了其他类的一个实例

Is-A是“是一个”的意思,一般是,某个类继承自某个类

记得英雄杀里,刘邦的技能叫驭人(好久了,不知道有没有改...),从这个技能的名字来说,驭人,对,就是能够充分利用周围的资源,来为自己服务。有事我们并不需要掌握太多的资源,只要我们能够调用到资源就足够了。而且,不是自己的东西,使用起来也会稍微的不在乎,灵活性,可替换性更强。

总之,多用组合,少用继承


恭喜,通过探究宇智波一族之谜,我们学习了第一个设计模式:

策略模式  定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

还是不太懂,没关系,戳这里,源码下载,看完代码之后再慢慢体会,相信会有收获




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值