zoukankan      html  css  js  c++  java
  • Java设计模式(15)——行为模式之策略模式(Strategy)

    一、概述

      概念

      

      UML简图

      

      角色

      

    二、实践

      我们先将上述的UML图的抽象情况下的代码写出,然后再给出一个具体的例子

      策略接口——当然如果有一些公共的行为,应当使用抽象类!

    /**
     * 策略接口
     *
     * @author Administrator
     **/
    public interface Strategy {
        void strategyMethod();
    }

      具体策略实现

    /**
     * 具体策略
     *
     * @author Administrator
     **/
    public class ConcreteStrategy implements Strategy{
        @Override
        public void strategyMethod() {
            // 算法逻辑
        }
    }

      环境

    /**
     * 环境
     *
     * @author Administrator
     **/
    public class Context {
        private Strategy strategy;
    
        public Context(Strategy strategy) {
            this.strategy = strategy;
        }
        public void contextMethod() {
            strategy.strategyMethod();
        }
        /*请勿将模式拘泥于形式
        public void method(Strategy strategy) {
            strategy.strategyMethod();
        }*/
    }

       我们稍加改造,改成一个具体的计算加减法的例子

    /**
     * 策略接口
     *
     * @author Administrator
     **/
    public interface Strategy {
        int calc(int a, int b);
    }
    /**
     * 加法策略
     *
     * @author Administrator
     **/
    public class PlusStrategy implements Strategy{
        @Override
        public int calc(int a, int b) {
            return a + b;
        }
    }
    /**
     * 减法策略
     *
     * @author Administrator
     **/
    public class MinusStrategy implements Strategy{
        @Override
        public int calc(int a, int b) {
            return a- b;
        }
    }
    /**
     * 环境
     *
     * @author Administrator
     **/
    public class Context {
        private Strategy strategy;
    
        public Context(Strategy strategy) {
            this.strategy = strategy;
        }
        public int calc(int a, int b) {
           return strategy.calc(a, b);
        }
    }

      这样,我们就可以在客户端通过环境调用了!

    /**
     * 客户端
     * @author  Administrator
     **/
    public class Client {
        public static void main(String[] args) {
            Context context = new Context(new PlusStrategy());
            System.out.println(context.calc(1, 2));
            Context context1 = new Context(new MinusStrategy());
            System.out.println(context1.calc(2, 1));
        }
    }

      当然,我们之前在Java8章节已经提到过,这样导致出现了很多实现类,单从语法层面上是可以改为拉姆达表达式的:

     public static void main(String[] args) {
            Context context = new Context((a, b)-> a+b);
            System.out.println(context.calc(2, 3));
        }
  • 相关阅读:
    笔记 : windows系统下 命令行 php --version 的版本与phpinfo()版本不一致问题
    笔记 : WampServe加装PHP版本(7.2.3)为例
    Browsersync结合gulp和nodemon实现express全栈自动刷新
    PHP与JSP简单比较
    BDD 与DSL 入门
    1.display:flex布局笔记
    Css预处理器---Less(三)
    python_30期_第2讲【字符串&运算符】
    python_30期_第5讲【while循环+for循环】
    class_05py作业
  • 原文地址:https://www.cnblogs.com/jiangbei/p/7756569.html
Copyright © 2011-2022 走看看