最实用的设计模式:策略模式的快速理解

简介: 策略模式是设计模式中一个相对来说比较好理解,应用也十分广泛的设计模式。在我工作这些年所接触的项目中,有一个项目在整体上就使用了策略模式。在百科上,针对策略模式是这样介绍的:策略模式指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。以某火锅品牌为例,同样是最后的收费环节,学生周末8.8折,工作日的指定时间6.9折,非学生全额支付。同样的收费方式在不同的情况下有不同的计算方式,这里就可以使用策略模式来实现。

(一)什么是策略模式


策略模式是设计模式中一个相对来说比较好理解,应用也十分广泛的设计模式。在我工作这些年所接触的项目中,有一个项目在整体上就使用了策略模式。在百科上,针对策略模式是这样介绍的:策略模式指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。


以某火锅品牌为例,同样是最后的收费环节,学生周末8.8折,工作日的指定时间6.9折,非学生全额支付。同样的收费方式在不同的情况下有不同的计算方式,这里就可以使用策略模式来实现。


(二)策略模式中的几个角色


在策略模式中,有三种角色:


抽象策略(Strategy):定义实现策略所需要的接口。一般是定义接口或者抽象类。


具体策略(ConcreteStrategy):抽象策略的具体实现类,在策略模式中,每个算法都是一个具体策略。


上下文(Context):负责使用策略的角色,屏蔽高层模块对策略的直接访问。


(三)策略模式的具体案例


还是以最开始的火锅店为例子。首先定义一个收费的策略接口,定义收费的方法:


publicinterfaceBillingStrategy {
voidbilling(BigDecimalamount);
}

接着写两个具体的策略:

// 周末8.8折publicclassStudentWeekendimplementsBillingStrategy{
@Overridepublicvoidbilling(BigDecimalamount) {
System.out.println("收了"+amount.multiply(newBigDecimal("0.88"))+"元");
    }
}
// 工作日6.9折publicclassStudentWorkingDayimplementsBillingStrategy{
@Overridepublicvoidbilling(BigDecimalamount) {
System.out.println("收了"+amount.multiply(newBigDecimal("0.69"))+"元");
    }
}

接着定义上下文角色,在这个例子中,负责使用策略的角色是火锅店:

publicclassRestaurant {
privateBillingStrategybillingStrategy;
publicRestaurant(BillingStrategybillingStrategy){
this.billingStrategy=billingStrategy;
    }
publicvoidbilling(BigDecimalamount){
billingStrategy.billing(amount);
    }
}

最后在Main方法中进行调用:

publicclassMain {
publicstaticvoidmain(String[] args) {
Restaurantrestaurant1=newRestaurant(newStudentWeekend());
restaurant1.billing(newBigDecimal("200"));
Restaurantrestaurant2=newRestaurant(newStudentWorkingDay());
restaurant2.billing(newBigDecimal("200"));
    }
}

从结果可以看出,同样的收费方式,当传入的策略不同时,就可以采取不同的算法。


(四)策略模式在源码中的应用


策略模式在开源代码和JDK源码中的应用十分广泛。


比如TreeMap在构造方法中引入Comparator排序策略,在put方法时根据不同的排序策略执行不同的排序方法:


网络异常,图片无法展示
|
网络异常,图片无法展示
|


又比如ThreadPoolExecutor这个线程池的类,在构造方法中传入拒绝策略,在reject方法中根据不同的拒绝策略执行具体的拒绝方法:


网络异常,图片无法展示
|
网络异常,图片无法展示
|


(五)策略模式的理解


其实不使用设计模式,一样可以写代码,甚至可以写的更简单,但是设计模式考虑的是代码的扩展和可维护性。


策略模式最大的优点是很方便地替换策略,甚至还可以在程序运行过程中切换策略,也遵循了设计模式中的开闭原则,即对扩展开放,对封闭关闭。缺点是每新增一个策略就需要新增一个类,另外客户端必须知道所有的策略类。



相关文章
|
1月前
|
设计模式 算法 Kotlin
Kotlin - 改良设计模式 - 策略模式
Kotlin - 改良设计模式 - 策略模式
49 4
|
3月前
|
设计模式 算法 测试技术
PHP中的设计模式:策略模式的应用与实践
在软件开发的浩瀚海洋中,设计模式如同灯塔,指引着开发者们避开重复造轮子的暗礁,驶向高效、可维护的代码彼岸。今天,我们将聚焦于PHP领域中的一种重要设计模式——策略模式,探讨其原理、应用及最佳实践,揭示如何通过策略模式赋予PHP应用灵活多变的业务逻辑处理能力,让代码之美在策略的变换中熠熠生辉。
|
29天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
45 1
|
1月前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
32 2
|
1月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
47 2
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文通过游泳运动员的案例,介绍策略模式及其在Kotlin中的改良应用,利用高阶函数简化代码结构,提高灵活性。
39 3
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文介绍策略模式在Kotlin中的应用,通过游泳运动员的例子,展示如何使用接口和高阶函数实现策略模式,使代码更简洁、灵活。
35 2
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
67 3
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
31 3
|
2月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第9天】 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在PHP开发中,通过使用策略模式,我们可以轻松切换算法或逻辑处理方式而无需修改现有代码结构。本文将深入探讨策略模式的定义、结构以及如何在PHP中实现该模式,并通过实际案例展示其应用价值和优势。
38 1