• 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));
        }
  • 相关阅读:
    mojoPortal学习笔记之页面访问权限控制
    页面中添加某模块
    styletreeview.css页面菜单
    mojoPortalprovider模式学习之1.1之IndexBuilderManager
    mojoportal学习笔记之HtmlContent模块
    CLR via c#学习笔记 之 引用类型与值类型
    mojoportal中解决下载文件名乱码问题
    mojoportal学习笔记之显示所有菜单
    blogmodule.css博客栏目
    [转]数据访问组件SqlHelper
  • 原文地址:https://www.cnblogs.com/jiangbei/p/7756569.html
Copyright © 2020-2023  润新知