Java 24 Design Pattern 之 策略模式

策略模式介绍

概述

使用场景

UML类图

策略模式实现

普通实现

使用策略模式实现

策略方法模式特点


行为型设计模式的学习。

策略模式介绍

概述

策略模式可以说算一种既简单又常用的设计模式了,因此需要我们好好的掌握它为我们所用。

同样先来策略模式的定义:策略模式定义了一系列算法,并将每个算法封装起来,让它们之间可以互相替换,让算法的变化独立于使用算法的客户。

好吧,这里还是不过多的纠结其定义,等到我们自己实现一遍之后自然会理解的。

使用场景

如果你在写代码的时候发现一个操作有多种实现方法,需要根据不同的情况使用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类中;

  • <
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

time Friend

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值