经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
java设计模式--策略模式详解
来源:jb51  时间:2021/7/19 13:31:10  对本文有异议

策略模式

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

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

使用场景:

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

在这里插入图片描述

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

Demo

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

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

首先看第一种方法:

在这里插入图片描述

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

在这里插入图片描述

代码:

  1. public interface FlyBehavior {
  2. void fly();
  3. }
  4. public class FlyGood implements FlyBehavior {
  5. @Override
  6. public void fly() {
  7. System.out.println("飞行能力优秀");
  8. }
  9. }
  10. public class FlyNormal implements FlyBehavior {
  11. @Override
  12. public void fly() {
  13. System.out.println("飞行能力一般");
  14. }
  15. }
  1. public interface SwimBehavior {
  2. void swim();
  3. }
  4. public class SwimGood implements SwimBehavior {
  5. @Override
  6. public void swim() {
  7. System.out.println("游得好");
  8. }
  9. }
  10. public class SwimNormal implements SwimBehavior {
  11. @Override
  12. public void swim() {
  13. System.out.println("游得一般");
  14. }
  15. }
  1. public abstract class Goose {
  2. //策略接口
  3. FlyBehavior flyBehavior;
  4. SwimBehavior swimBehavior;
  5. //其他属性等...
  6. public void setFlyBehavior(FlyBehavior flyBehavior) {
  7. this.flyBehavior = flyBehavior;
  8. }
  9. public void setSwimBehavior(SwimBehavior swimBehavior) {
  10. this.swimBehavior = swimBehavior;
  11. }
  12. }
  13. public class Swan extends Goose{
  14. public Swan() {
  15. flyBehavior=new FlyNormal();
  16. swimBehavior=new SwimNormal();
  17. }
  18. }
  19. public class WildGoose extends Goose{
  20. public WildGoose() {
  21. flyBehavior=new FlyGood();
  22. swimBehavior=new SwimNormal();
  23. }
  24. }
  25. public class GreyGoose extends Goose{
  26. public GreyGoose() {
  27. flyBehavior=new FlyNormal();
  28. swimBehavior=new SwimGood();
  29. }
  30. }
  1. public class Client {
  2. public static void main(String[] args) {
  3. Swan swan=new Swan();
  4. swan.flyBehavior.fly();
  5. WildGoose wildGoose=new WildGoose();
  6. wildGoose.swimBehavior.swim();
  7. GreyGoose greyGoose=new GreyGoose();
  8. greyGoose.flyBehavior.fly();
  9. greyGoose.setFlyBehavior(new FlyGood()); //改变某个对象的行为
  10. greyGoose.flyBehavior.fly();
  11. }
  12. }

运行结果:

在这里插入图片描述

总结

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号