当前位置:   article > 正文

Java设计模式——策略设计模式_java 状态设计模式 策略设计模式

java 状态设计模式 策略设计模式

上一次我们聊了简单工厂模式,让大家了解到了如何使程序具备更高的解耦性,使每一个功能代码都独立出来,今天我们和大家聊一下另一种解耦的设计模式,它就是策略设计模式。

什么是策略设计模式:它定义了算法家族,分别封装起来,让他们之间可以项目替换,此模式让算法的变化,不会影响到算法的客户。我们可以这样理解,工厂模式是让我们内部的构造变得高内聚低耦合,而策略模式是让我们的内部代码和外部客户端代码不直接进行联系,而是通过一个桥梁来进行沟通,并且使相同算法或功能的代码进行封装。给大家用UML图进行展示一下:



大家通过上方的UML图可以看出,策略设计模式的思想为封装算法类,通过一个上下文的类,来沟通客户端和服务器端的逻辑代码。给大家代码演示一下:

  1. /**
  2. * 此类为抽象的基类,用于具体的代码来继承使用
  3. *
  4. */
  5. public abstract class StragerySuper {
  6. //算法方法,用于具体的逻辑算法来实现
  7. public abstract void AlphInterfact();
  8. }

具体的实现代码类:

  1. /**
  2. *具体的算法实现代码A
  3. *
  4. **/
  5. class ConcreteA extends StragerySuper{
  6. @Override
  7. public void AlphInterfact() {
  8. System.out.print("算法A的实现类");
  9. }
  10. }

  1. /**
  2. *具体的算法实现代码B
  3. *
  4. **/
  5. class ConcreteB extends StragerySuper{
  6. @Override
  7. public void AlphInterfact() {
  8. System.out.print("算法B的实现类");
  9. }
  10. }

  1. /**
  2. *具体的算法实现代码C
  3. *
  4. **/
  5. class ConcreteC extends StragerySuper{
  6. @Override
  7. public void AlphInterfact() {
  8. System.out.print("算法c的实现类");
  9. }
  10. }

上下文类,作为连接客户端和后台代码端的桥梁

  1. /**
  2. *Context类,用于和外界进行联系的类,用来对StrategySuper的引用
  3. ***/
  4. class Context{
  5. StragerySuper stragerySuper;
  6. public Context(StragerySuper stragerySuper){
  7. //初始化构造函数,传递具体的策略对象
  8. this.stragerySuper = stragerySuper;
  9. }
  10. //上下文接口,根据具体的策略对象,调用其算法的方法,执行具体的逻辑方法
  11. public void ContextInterface(){
  12. stragerySuper.AlphInterfact();
  13. }
  14. }

客户端代码:


  1. /**
  2. *客户端代码,通过Context中间类,来实现对具体实现类的调用
  3. **/
  4. class Client{
  5. Context context;
  6. public void main(){
  7. //客户端通过context执行具体的逻辑代码
  8. context = new Context(new ConcreteA());
  9. context.ContextInterface();
  10. context = new Context(new ConcreteB());
  11. context.ContextInterface();
  12. context = new Context(new ConcreteC());
  13. context.ContextInterface();
  14. }
  15. }

Tips:以上代码有一些是伪代码,所以大家在编译运行的时候要根据自己的实际情况进行修改,切勿直接粘贴复制!

大家看策略模式是不是和简单工厂模式有点雷同,下面我们把两个设计模式结合起来去实现,大家会发现我们的代码会更简洁和高效,每一种设计模式不是独立,他们都是可以交叉使用的。我们只有不断的在我们的代码中去应用到这些设计模式,那么我们的编程思想会越来越灵活。

就像上面策略模式代码中所体现的那样,我们会发现我们的客户端还是比较臃肿,生成了很多Context的类,我们能不能把策略模式和工厂模式相结合呢,在桥梁类Context中去做判断和生成不同业务逻辑相对应的业务类呢?代码如下:



  1. /**
  2. *Context类,用于和外界进行联系的类,用来对StrategySuper的引用
  3. ***/
  4. class Context{
  5. StragerySuper stragerySuper = null;
  6. public Context(String type){
  7. //初始化时传递类型,直接在Context类中生成相对应的实现类
  8. switch(type){
  9. case "A":
  10. stragerySuper = new ConcreteA();
  11. break;
  12. case "B":
  13. stragerySuper = new ConcreteB();
  14. break;
  15. case "C":
  16. stragerySuper = new ConcreteC();
  17. break;
  18. }
  19. }
  20. //上下文接口,根据具体的策略对象,调用其算法的方法,执行具体的逻辑方法
  21. public void ContextInterface(){
  22. stragerySuper.AlphInterfact();
  23. }
  24. }

  1. /**
  2. *客户端代码,通过Context中间类,来实现对具体实现类的调用
  3. **/
  4. class Client{
  5. Context context;
  6. public void main(){
  7. //在客户端,我们可以直接调用,而不用去全部生成判断了
  8. Context con = new Context("A");
  9. con.ContextInterface();
  10. }
  11. }

Tips:以上代码有一些是伪代码,所以大家在编译运行的时候要根据自己的实际情况进行修改,切勿直接粘贴复制!

这样客户端的代码是不是简洁了许多,我们把很多逻辑上的操作都封装在我们的Context类中,这样我们的客户端就看不到我们的逻辑实现,用户只需要传递他需要的类型,用户就能获取对应的结果值,对于用户来说简单直接。

策略模式的优势不知道大家发现了没有,我们通过这两天的例子可以发现,策略模式封装了算法,封装的这些算法都是完成功能相近的功能,只是实现不一样,减少了算法类和实现类之间的耦合性。






Good luck!

Write by Jimmy.li










声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/92818
推荐阅读
相关标签
  

闽ICP备14008679号