gpt4 book ai didi

java设计模式--策略模式详解

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 34 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章java设计模式--策略模式详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

策略模式

策略模式(Strategy Pattern)属于行为型模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。用算法族分别封装起来,实现同一个接口,让他们之间可以互相替换,让算法的变化独立于使用算法的客户.

  • 主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
  • 如何解决:将这些算法封装成一个一个的类,任意地替换。
  • 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。

使用场景:

  • 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
  • 一个系统需要动态地在几种算法中选择一种。
  • 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
优点 缺点
算法可以自由切换 策略类会增多
避免使用多重条件判断 所有策略类都需要对外暴露
扩展性良好  

java设计模式--策略模式详解

  • 环境类(Context):持有抽象策略类的引用,用来操作策略的上下文环境。
  • 抽象策略类(Strategy):策略的抽象类或接口,给出所需实现接口。
  • 具体策略类(ConcreteStrategy):具体的策略实现。

Demo

有几种鹅:天鹅、野鹅、灰鹅,鹅有各种行为,如飞、游泳、叫等.

假设天鹅灰鹅飞行能力一般,野鹅飞行能力优秀;天鹅野鹅游泳能力一般,灰鹅游泳能力优秀.

首先看第一种方法:

java设计模式--策略模式详解

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

java设计模式--策略模式详解

代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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( "飞行能力一般" );
     }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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( "游得一般" );
     }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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();
     }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
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设计模式--策略模式详解

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我的更多内容! 。

原文链接:https://wzlodq.blog.csdn.net/article/details/111245683 。

最后此篇关于java设计模式--策略模式详解的文章就讲到这里了,如果你想了解更多关于java设计模式--策略模式详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com