小编给大家分享一下java设计模式中策略模式的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
策略模式
策略模式(Strategy Pattern)属于行为型模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。用算法族分别封装起来,实现同一个接口,让他们之间可以互相替换,让算法的变化独立于使用算法的客户。
主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
如何解决:将这些算法封装成一个一个的类,任意地替换。
何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
使用场景:
优点 | 缺点 |
---|
算法可以自由切换 | 策略类会增多 |
避免使用多重条件判断 | 所有策略类都需要对外暴露 |
扩展性良好 |
|

环境类(Context):持有抽象策略类的引用,用来操作策略的上下文环境。
抽象策略类(Strategy):策略的抽象类或接口,给出所需实现接口。
具体策略类(ConcreteStrategy):具体的策略实现。
Demo
有几种鹅:天鹅、野鹅、灰鹅,鹅有各种行为,如飞、游泳、叫等。
假设天鹅灰鹅飞行能力一般,野鹅飞行能力优秀;天鹅野鹅游泳能力一般,灰鹅游泳能力优秀。
首先看第一种方法:

这种方法固然可以实现目的,但问题显而易见,子类过多覆盖父类方法,代码未复用,耦合度很高。使用策略模式,简单来说,就是封装子类行为成接口,父类包含该接口即可。

代码:
public interface FlyBehavior {
void fly();
}
public class FlyGood implements FlyBehavior {
@Override
public void fly() {
System.out.println("飞行能力优秀");
}
}
public class FlyNormal implements FlyBehavior {
@Override
public void fly() {
System.out.println("飞行能力一般");
}
}
public interface SwimBehavior {
void swim();
}
public class SwimGood implements SwimBehavior {
@Override
public void swim() {
System.out.println("游得好");
}
}
public class SwimNormal implements SwimBehavior {
@Override
public void swim() {
System.out.println("游得一般");
}
}
public abstract class Goose {
//策略接口
FlyBehavior flyBehavior;
SwimBehavior swimBehavior;
//其他属性等...
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setSwimBehavior(SwimBehavior swimBehavior) {
this.swimBehavior = swimBehavior;
}
}
public class Swan extends Goose{
public Swan() {
flyBehavior=new FlyNormal();
swimBehavior=new SwimNormal();
}
}
public class WildGoose extends Goose{
public WildGoose() {
flyBehavior=new FlyGood();
swimBehavior=new SwimNormal();
}
}
public class GreyGoose extends Goose{
public GreyGoose() {
flyBehavior=new FlyNormal();
swimBehavior=new SwimGood();
}
}
public class Client {
public static void main(String[] args) {
Swan swan=new Swan();
swan.flyBehavior.fly();
WildGoose wildGoose=new WildGoose();
wildGoose.swimBehavior.swim();
GreyGoose greyGoose=new GreyGoose();
greyGoose.flyBehavior.fly();
greyGoose.setFlyBehavior(new FlyGood()); //改变某个对象的行为
greyGoose.flyBehavior.fly();
}
}
运行结果:

看完了这篇文章,相信你对“java设计模式中策略模式的示例分析”有了一定的了解,如果想了解更多相关知识,欢迎关注天达云行业资讯频道,感谢各位的阅读!