策略模式
通过学习设计模式,你将学到如何利用其他开发人员的经验与智慧。
使用设计模式的最好方式是“把设计模式装进脑袋里,然后在你的设计和已有的应用中,寻找何处可以使用它们”。
今天我们要讲的就是策略模式,代码在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
- 点赞
- 收藏
- 关注作者
评论(0)