软件体系结构--策略模式

文章目录

  • 概念
  • 代码实现
  • 优点

概念

策略模式定义了一类算法,分别封装起来,让这些算法之间可以相互替换,从而达到实现不同功能的目的。策略模式让算法的变化独立于使用算法的客户。

策略模式类图:
image

从图中可以看出,操作被封装到类中,这些又都实现了同一个接口,然后在Context类中被调用。

举一个具体的例子,如计算器:

image

代码实现

还是以计算器为例

首先是Operation接口:

public interface Operation{
    public int doOpertaion(int num1, int num2);
}

两个实现类-加法与减法:

public class AddOperation implements Operation{
    @Override
    public int doOperation(int num1, int num2){
        return num1 + num2;
    }
}
public class MinusOperation implements Operation{
    @Override
    public int doOperation(int num1, int num2){
        return num1 - num2;
    }
}

计算器类:

public class Calculator{
    private Operation operation;
    
    public void setOperation(Operation operation){
        this.operation = operation;
    }
    
    public int calculate(int num1, int num2){
        return this.operation.doOperation(num1, num2);
    }
}

使用:

Calculator calculator = new Calculator();
calculator.setOperation(new AddOperation);
int result = calculator.calculate(2,3); //5

优点

说到策略模式的优点,一开始我也很疑惑。还是计算器那个例子,为什么一定要把加减乘除等运算封装到类中呢?直接写在Calculator类里面不好吗?

但是策略模式的优点就在于易于扩展。如果我们想往计算器里添加计算三角函数以及开平方的功能。如果使用刚刚说的将各种运算直接写在Calculator类中,那么如果要添加功能就必须得修改Calculator类的代码。

而直接修改Calculator类又可能会出现不可预知的问题。

但是如果采用的是策略模式,想要添加一个新的功能仅需要写一个新的Operation实现类就可以了。

这也体现了设计模式的一个基本原则:开放封闭原则。即对扩展开放,对修改封闭。

对修改封闭就是不希望他人修改自己的代码,而对扩展开放就是希望别人以扩展的形式增加功能。

其实很好理解,相信大家都见过多用途螺丝刀。一把螺丝刀配有很多的头。换上不同的头就能够拧开不同的螺丝。螺丝刀就是那个Calculator类,而螺丝头就是Operation的实现类。

你可能感兴趣的:(软件体系结构)