zoukankan      html  css  js  c++  java
  • Java设计模式系列之策略模式

        策略模式的定义:

          定义了算法族,分别封装起来,让它们之间可以互相替换 ,此模式让算法的变化独立于使用算法的客户 

      策略模式的意义:

       策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之间是低耦合的关系。

        低耦合的特性使软件具有更强的可扩展性,易于维护;更重要的是,它大大提高了软件的可重用性。

        策略模式中有三个对象:
          环境对象(Context):该类中实现了对抽象策略中定义的接口或者抽象类的引用。
          抽象策略对象(Strategy):它可由接口或抽象类来实现。
          具体策略对象(ConcreteStrategy):它封装了实现同不功能的不同算法。

      三者之间的关系可以用下图来表示:

                

          策略模式的实现:

      1.对策略对象定义一个公共接口。

      2.编写策略类,该类实现了上面的公共接口。

      3.在使用策略对象的类中保存一个对策略对象的引用。

      4.在使用策略对象的类中,实现对策略对象的set和get方法或者使用构造方法完成赋值。

    具体代码实现:

    定义一个接口( 抽象策略),定义一个方法用于对两个整数进行运算

    public interface Strategy {
    
        public abstract int calculate(int a,int b);
    
     }

    定义具体的算法类,实现两个整数的加减乘除运算,但是外部调用形式需要符合接口的定义

    实现加法运算

    public class AddStrategy implements Strategy{
    
        @Override
        public int calculate(int a, int b) {
            
            return a+b;
        }
    
    }

    实现减法运算

    public class SubstractStrategy implements Strategy{
    
         @Override
         public int calculate(int a, int b) {
             
             return a-b;
         }
     
     }

    实现乘法运算

     public class MultiplyStrategy implements Strategy {
     
         @Override
         public int calculate(int a, int b) {
             
             return a*b;
         }
     
     }

    实现除法运算

     public class DivisionStrategy  implements Strategy{
      
          @Override
         public int calculate(int a, int b) {
              if(b!=0){
                  
                 return a/b;
              }
              else {
                 throw new RuntimeException("除数不能为零");
             }
         }
     
     }

    定义具体的环境角色,持有Strategy接口的引用,并且有get和set方法可以完成策略更换。在环境角色中调用接口的方法完成动作。

    public class Context {
    
        private Strategy strategy;
        
        public Context(Strategy strategy) {
            super();
            this.strategy = strategy;
        }
    
        public Strategy getStrategy() {
            return strategy;
        }
    
        public void setStrategy(Strategy strategy) {
            this.strategy = strategy;
        }
        public int calculate(int a,int b){
            return strategy.calculate(a, b);
        }
    }

    这样在客户端在调用时,只需向环境角色设置相应的算法类,然后就可以得到相应的结果。

    public class StrategyTest {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
    
            //加法
            Context context=new Context(new AddStrategy());
            System.out.println(context.calculate(10, 5));
            //减法
            Context context2=new Context(new SubstractStrategy());
            System.out.println(context2.calculate(3, 2));
            //乘法
            Context context3=new Context(new MultiplyStrategy());
            System.out.println(context3.calculate(6, 8));
            //除法
            Context context4=new Context(new DivisionStrategy());
            System.out.println(context4.calculate(90, 9));    
        }
    
    }

    策略模式的缺点:

    1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。
    2、策略模式造成很多的策略类,每个具体策略类都会产生一个新类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。
  • 相关阅读:
    如何通过命令行窗口查看sqlite数据库文件
    eclipse自动补全的设置
    文本装饰
    注释和特殊符号
    文本装饰
    网页背景
    通过ArcGIS Server admin 查看和删除已注册的 Web Adaptor
    通过 ArcGIS Server Manager 查看已安装的 Web Adaptor
    通过 ArcGIS Server Manager 验证 DataStore
    Windows上安装ArcGIS Enterprise——以 Windows Server 2012 R2上安装 ArcGIS 10.8为例
  • 原文地址:https://www.cnblogs.com/ysw-go/p/5379971.html
Copyright © 2011-2022 走看看