行为型设计模式的学习。
策略模式介绍
概述
策略模式可以说算一种既简单又常用的设计模式了,因此需要我们好好的掌握它为我们所用。
同样先来策略模式的定义:策略模式定义了一系列算法,并将每个算法封装起来,让它们之间可以互相替换,让算法的变化独立于使用算法的客户。
好吧,这里还是不过多的纠结其定义,等到我们自己实现一遍之后自然会理解的。
使用场景
如果你在写代码的时候发现一个操作有多种实现方法,需要根据不同的情况使用if-else结构来确定实现方式的时候,想一想是否可以用本文介绍的策略模式。
举个例子,作为21世纪的宅男宅女们,相信都用过美团吧,假如某个入驻美团的商家为了促销,设置多种会员优惠,包含超级会员7折、普通会员9折和普通用户没有折扣三种。用户在付款的时候,根据用户的会员等级,就可以知道用户符合哪种折扣策略,进而计算出实付金额。
在这个例子中,计算实付金额这个操作需要根据用户等级来确定实现方式,因此非常适合用策略模式实现。
UML类图
以上面的场景为例,策略模式的UML类图如下:
UML 类图也不复杂,只有三个部分:
-
• 1.策略接口CalculateStrategy:该接口定义了计算价格的抽象方法,由具体的策略实现类去实现该抽象方法;
-
• 2.多个具体策略类:针对不同的会员,定义三种具体的策略类,每个类中都分别实现计算价格方法;
-
• 3.策略上下文类StrategyContext:该类是集成各种实现算法的类。
策略模式实现
普通实现
我们先来看看不使用策略模式实现的代码:
enum Grade{
COMMON_USER, //普通用户
COMMON_MEMBER, //普通会员
SUPER_MEMBER //超级会员
}
class CalculatorRealAmount{
public double calculator(double price, Grade grade){
double realAmount = 0.0;
if (grade == Grade.COMMON_USER){
realAmount = price;
}else if(grade == Grade.COMMON_MEMBER){
realAmount = price * 0.9;
}else if (grade == Grade.SUPER_MEMBER){
realAmount = price * 0.7;
}else{
System.out.println("不支持的会员等级");
}
return realAmount;
}
}
public class NonStrategyPatternExample {
public static void main(String[] args) {
CalculatorRealAmount calculatorRealAmount = new CalculatorRealAmount();
System.out.println(calculatorRealAmount.calculator(100, Grade.COMMON_USER));
System.out.println(calculatorRealAmount.calculator(100, Grade.COMMON_MEMBER));
System.out.println(calculatorRealAmount.calculator(100, Grade.SUPER_MEMBER));
}
}
******************【运行结果】******************
100.0
90.0
70.0
我们可以分析下这种写法有什么不好的地方:
-
• 1.违反了单一职责原则:每种会员的计算方式都写在了CalculatorRealAmount类中;
<