zoukankan      html  css  js  c++  java
  • 秒懂策略模式--简单明了的例子

     

    1.

    策略模式将行为和环境隔离开来,环境角色类负责维持和查询行为的类,各种类似的逻辑算法都在各个具体的策略类中进行实现,由于环境和行为隔离开来,所以行为的逻辑变更不会影响到环境和客户端。

    2.uml类图:

    这个模式涉及到三个角色:

    环境(Context)角色:持有一个Strategy的引用。

    抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

    具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

    3.代码结构截图:(代码不多,耐心看完)

    4.代码如下:

          abstract修饰方法就是要求其子类覆盖(实现)这个方法。调用时可以以多态方式调用子类覆盖(实现)后的方法,也就是说抽象方法必须在其子类中实现,除非子类本身也是抽象类。
         
          需要注意:父类是抽象类,其中有抽象方法,那么子类继承父类,并把父类中的所有抽象方法都实现(覆盖)了,子类才有创建对象的实例的能力,否则子类也必须是抽象类。
         
          凡是抽象类,就一定会是某个类的父类!否则,这个抽象类的存在没有意义,因为抽象类不能被实例化。
         
          既然抽象类一定是某一个类的父类,所以,这个抽象类一定要有构造函数!这样,抽象类的子类才能成功实例化。
         
          抽象类也有构造函数,只是,这个构造函数是给子类提供的。所以如果抽象类继承其他类,那么抽象类的构造函数也会使用super语句,所以被继承类也必须有对外提供的构造函数
         
    复制代码
    public abstract class Strategy {
        //定义抽象策略的方法
        public abstract int strategy(int a, int b);//假如这是一种支付业务,支付策略有4种
    }
    
    
    复制代码

    public class StrategyOne extends Strategy { public int strategy(int a, int b) { //无卡支付方式 return a + b*2;//此处写相关业务代码 } } public class StrategySecond extends Strategy { //会员支付方式 public int strategy(int a, int b) { return a+b;//此处写相关业务代码 } } public class StrategyThird extends Strategy { //applePay支付 public int strategy(int a,int b) { return a+b*3;//此处写相关业务代码 } } public class StrategyFourth extends Strategy { public int strategy(int a,int b) {//某某支付方式 return a+b*4;//此处写相关业务代码 } }
    复制代码
    复制代码
    复制代码
    public class Context {
        //持有抽象策略角色的引用,用于客户端调用
        private Strategy strategy;//获得策略类
    
        public Strategy getStrategy() {
            return strategy;
        }
    
        //设置所需策略
        public void setStrategy(Strategy strategy) {
            this.strategy = strategy;
    
        }
    
        //根据设置的策略类返回对应的结果
        public int getResult(int a, int b) {
            return strategy.strategy(a, b);
        }
    
    
    }
    复制代码
    复制代码
    public class Client {
        public static void main(String[] args) {
    
            Context context = new Context();
    
            int result;
    
            context.setStrategy(new StrategySecond());
    
            result = context.getResult(1, 2);
    
            System.out.println("Second: "+result);
    
            context.setStrategy(new StrategyOne());
    
            result =context.getResult(1, 2);
    
            System.out.println("One: "+result);
    
            context.setStrategy(new StrategyThird());
    
            result = context.getResult(1, 2);
    
            System.out.println("Third: "+result);
    
            context.setStrategy(new StrategyFourth());
    
            result = context.getResult(1, 2);
    
            System.out.println("Fourth: "+result);
        }
    }
    复制代码
  • 相关阅读:
    SQL_Server_2005_启用远程连接
    Oracle外网或内网远程连接
    还原数据库到指定时间点
    SQL Server账号密码(sa)登录失败 错误原因:18456
    sql server如何设置密码过期时间呢?
    安装SQL Server2014 :规则”Windows Management Instrumentation (WMI)服务 “失败
    impala
    dolphinscheduler
    829. Consecutive Numbers Sum 连续的数字求和
    472. Concatenated Words 查找自己拼出来的单词 反向word break
  • 原文地址:https://www.cnblogs.com/zyy1688/p/11425472.html
Copyright © 2011-2022 走看看