zoukankan      html  css  js  c++  java
  • JAVA设计模式——(2)策略模式

    定义

    定义一种算法,将每个算法都封装起来,并且使它们之间可以互换。是一种行为类模式。

    举例

    为了通俗易懂,我们拿各国的税率计算来举例子:

    假设当前我们的程序只能支持计算中国和美国的税率:

     1 public class Tax_Cal {
     2     
     3     public int CN_Cal(int x) {       // 计算中国税
     4         
     5     }
     6     
     7     public int US_Cal(int x) {       // 计算美国税
     8         
     9     }
    10 }

    这样写看起来没什么问题,但实际上我们想想,如果以后公司还要拓展,开始支持法国,日本等等国家,那么我们这个类就得不断但改啊改,是不是特别麻烦且危险?比如万一和前面的某个国家冲突了,就会影响到前面的计算。

    所以我们干脆分开来写,把所有的国家税的计算都独立出来,实现的都是同一个接口,都有一个共同的参数x。

     1 public class Strategy {          // 策略模式
     2     public int Cal(int x);
     3 }
     4 
     5 public class CN_Tax implements Strategy {     // 实现中国税计算接口
     6 
     7     @Override
     8     public int Cal(int x) {
     9 
    10     }
    11 }
    12 
    13 public class US_Tax implements Strategy {     // 实现美国税计算接口
    14 
    15     @jOverride
    16     public int Cal(int x) {
    17 
    18     }
    19 }
    20 
    21 public class Tax_Cal {            // 税计算类
    22 
    23     private Strategy = strategy;         // 定义一个策略
    24 
    25     public void setStrategy(Strategy strategy) {     // 接入策略
    26         this.strategy = strategy;
    27     }
    28 
    29     public int getTax(int x) {      // 得到结果
    30         return this.strategy.cal
    31     }
    32 }

    这样一来,所有的税务计算就互不影响啦,因为它们的计算已经被我们独立出来了,要计算哪一个国家的税,只需要接入该国家的算法,调用一下getTax就可以了。我们来写一下:

    1 public class Test {
    2     public static void main(string[] args) {
    3         Tax_Cal tax_cal = new Tax_Cal();       // 实例化对象
    4         tax_cal.setStrategy(new CN_Tax());     // 接入中国税计算
    5         int res = tax_cal.getTax(100);       // 得到结果
    6     }
    7 }

    总结:

    优点:

    1. 策略间可以自由的切换,因为它们都实现自同一个抽象。
    2. 易于拓展,基本上可以在不改变原有代码的基础上进行拓展。
    3. 避免使用多重条件语句,否则就得一直if else, switch case,这样非常不利于维护。

    策略模式是一种简单常用的设计模式,一般来说不会单独使用,而是和其它模式混合使用。

  • 相关阅读:
    shell 遍历当前目录以及所有子目录下文件
    linux shell 字符串操作(长度,查找,替换)详解
    将自定义结构存入std::set 或者 std::map
    CentOS下搭建SVN服务器
    基于Debian的linux系统软件安装命令
    rm搭配grep删除符合条件的文件
    Centos系统环境
    怎么恢复用mysqldump备份数据和恢复数据
    mac 安装 node.js 的 canvas
    centos 6.5 安装 node.js 的 canvas模块
  • 原文地址:https://www.cnblogs.com/Satan666/p/12676379.html
Copyright © 2011-2022 走看看