Java设计模式之策略模式(一)
今年寒假没有回家,打算利用这个假期的时间进行学习设计模式,这一个人感觉比较牛的知识,前一段时间一直在忙着搞自己的专业课,还有就是捣鼓了一下Linux系统,没有好好的学习关于Java还有Android方面的知识。我想学习设计模式的原因是在于大二暑假的时候自己做了一自己的APP,有点商业化的软件。在做这个APP的过程中,我发现了很多的问题,比如自己在实现功能的时候会为了一个共同的功能需要写很多的重复的代码,这也让我很苦恼,当然当时也接触了一些的设计模式比如单例模式之类的。所以这就滋生了我学习设计模式的想法。好啦,废话不多说了,开始将策略模式的实现吧。
**什么是策略模式**
策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
**策略模式的三个角色**
(1)环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。
(2)抽象策略对象:它可由接口或抽象类来实现。
(3)具体策略对象:它封装了实现同不功能的不同算法。
**设计原则:(1)针对接口编程,而不是针对实现编程。
(2)多用组合,少用继承。
(3)封装变化。**
**设计基础:(1)抽象
(2)封装
(3)继承
(4)多态**
应用实例:
设计鸭子的行为不同的鸭子需要有不同的行为,比如有的鸭子可以飞,有的则不可以,有的鸭子可以大声鸣叫,有的则是小声鸣叫。但是。所有的鸭子都可以游泳,应为这时他们的天性。
实现的代码如下:
首先是根据针对接口编程,不针对实现编程的原则,先建立两个接口:FlyBehavior接口和QuackBehavior接口。
QuackBehavior接口:
package com.example.duck;
public interface QuackBehavior {
public void quack();
}
FlyBehavior接口:
package com.example.duck;
public interface FlyBehavior {
public void fly();
}
建立一个公共类Duck,因为鸭子有很多的共性
package com.example.duck;
/**
*
* @author bingbingliang
*含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写
*抽象类不能被实例化
*你会发现在下面的例子中会有这样的实例化的调用
*/
public abstract class Duck {
FlyBehavior flybehavior;
QuackBehavior quackbehavior;
public Duck(){}
//创建抽象方法,抽象类中的抽象方法必须被实现,但是抽象类中的普通方法可以不必被实现
public abstract void display();
public void performFly(){
flybehavior.fly();
}
public void performquack(){
quackbehavior.quack();
}
public void swim(){
System.out.println("All Duck float,even decoys");
}
}
公共类需要继承来实现那些不同的功能。
MallarDuck类
package com.example.duck;
public class MallarDuck extends Duck{
public MallarDuck(){
//改得时候只需要该这个地方就可以了
flybehavior = new FlyWithWings();
quackbehavior = new Quack();
}
public void display(){
System.out.println("I'm a real MallarDuck");
}
}
鸭子的不同的功能中使用FlyBehavior接口实现
FlyNoWay类(不会飞的鸭子)
package com.example.duck;
public class FlyNoWay implements FlyBehavior{
public void fly(){
System.out.println("I can't flys");
}
}
FlyWithWings类(会飞的鸭子)
package com.example.duck;
public class FlyWithWings implements FlyBehavior{
public void fly(){
System.out.println("I can fly with my wings");
}
}
Quack类(小声叫的鸭子)
package com.example.duck;
public class Quack implements QuackBehavior{
public void quack(){
System.out.println("Quack");
}
}
Squack类(大声叫的鸭子)
package com.example.duck;
public class Squack implements QuackBehavior{
public void quack(){
System.out.println("Squack");
}
}
主函数MiniDuckSimulator类
package com.example.duck;
public class MiniDuckSimulator {
public static void main(String[] args) {
// TODO Auto-generated method stub
Duck mallard = new MallarDuck();
mallard.performFly();
mallard.performquack();
}
}
好啦。上面的功能到这里就实现出来了,实现的结果如下:
I can fly with my wings
Quack
这个实例也实现了多用组合,少用继承的原则。
策略模式的优点
(1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
(2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。
策略模式的缺点
(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
(2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。