策略模式

yd_221104950 发表于 2020/12/02 23:59:03 2020/12/02
【摘要】 通过学习设计模式,你将学到如何利用其他开发人员的经验与智慧。 使用设计模式的最好方式是“把设计模式装进脑袋里,然后在你的设计和已有的应用中,寻找何处可以使用它们”。 今天我们要讲的就是策略模式,代码在Github上了: 看看UML: 策略模式的定义 定义了算法族,分别封装起来,让它们之间可以互相替换,让算法的变化独立于算法的客户(父类,使用算法的类)。 我们不...

通过学习设计模式,你将学到如何利用其他开发人员的经验与智慧。
使用设计模式的最好方式是“把设计模式装进脑袋里,然后在你的设计和已有的应用中,寻找何处可以使用它们”。

今天我们要讲的就是策略模式,代码在Github上了:

看看UML:
在这里插入图片描述

策略模式的定义

定义了算法族,分别封装起来,让它们之间可以互相替换,让算法的变化独立于算法的客户(父类,使用算法的类)。
我们不再说鸟的一系列行为,如飞、鸣叫,是“一组行为”,而是“一族算法”。
所谓“算法”,就是能做的事,如上例实现接口的fly方法、tweet方法。

策略模式的组成

1.一个父类,包含了所有对象都要有的属性和方法。其中容易变化的部分以接口形式声明在父类中,实现独立实现,即单独成为一类,这是为了在运行时,再赋予其具体的行为,而不是一开始就写死了。
2.继承父类的子类,重用父类代码。
3.异变部分的接口实现。
以上三部分具体的使用请看Github上的代码

论证此模式的好处

我们都知道继承父类就可以实现代码复用,减少代码量。比如说,鸟一般都会飞,那么如果在每个鸟的子类(好几十个)上去添加这个fly()行为,目的一定可以达到,但都一定会造成大量代码的重复;如果在父类中添加fly()方法的实现,所有子类都能继承fly()方法。但是,我们没有考虑到有些鸟是不会飞的,如鸵鸟。亦即说,fly这个行为对很多鸟来说都是有所不同的。那么最好的办法就是将fly行为放在一个接口里,然后父类中放置接口的声明。接口的实现独立于类。那么每个子类都可以通过父类提供的set方法,来设置它们各自的行为,我们看父类里的代码:

public abstract class Bird {
	...... private FlyBehavior flyBehavior; public void performFly(){ if(flyBehavior != null){ flyBehavior.fly(); } } public void setFlyBehavior(FlyBehavior flyBehavior) { this.flyBehavior = flyBehavior; } .....
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

这样子不但可以适应各种不同的飞行为,而且实现了的行为都可以继续被其他鸟利用,在最大程度上复用了代码。多好!

要达到上述目的有一个难点:
我们需要分析需求,找出应用中可能需要变化的地方,然后把它们独立出来。不要将它们和那些不需要变化的代码混在一起。

独立出来的意思就是要把变化的部分单独封装起来。以便以后修改、扩展,而不影响不需要变化的其他部分。这几乎是所有设计模式背后的精神所在。

在上述例子中,我们用了一个接口声明在父类里,作为具体实现的“占位符”。那么我们在继续编写时,针对这个接口,要考虑的是这个接口里有些什么方法,而不是去考虑实现了这个接口的类里会怎么做。这个就叫作针对接口(也可以是超类,这个超类一般是抽象类)编程,而不是针对实现编程。这样才能写出更容易扩展的代码,而不致于被实现绑得死死的。

上面我们也看到,为了让我们的代码能“造”出更多不同的“鸟”,我们把有可能不同的部分都做了接口(做成抽象类也可以),然后再组装出一只鸟来。这说明组合比继承更能适应变化。

谢谢阅读!

文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_40763897/article/details/88338224

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。