策略模式:原理、应用与示例
文章目录
策略模式(Strategy Pattern)以其独特的设计理念和广泛的应用场景,为我们解决许多复杂的问题提供了有力的支持。
一、什么是策略模式
(一)定义与概念
策略模式是一种行为型设计模式,它定义了一系列算法,将每个算法都封装起来,并且使它们之间可以相互替换。策略模式让算法的变化独立于使用算法的客户。简单来说,就是把不同的策略封装成一个个独立的类,这些类实现相同的接口或继承相同的抽象类,这样在需要使用这些策略的地方,可以根据不同的情况灵活地选择和切换具体的策略。
(二)结构组成
- 抽象策略(Strategy):定义了一个公共接口,所有具体的策略类都必须实现这个接口。这个接口通常包含了一些抽象方法,这些方法定义了具体策略类需要实现的行为。
- 具体策略(ConcreteStrategy):实现了抽象策略接口的具体类,每个具体策略类对应一种具体的算法或行为。它们负责实现抽象策略中定义的方法,提供具体的实现逻辑。
- 环境(Context):持有一个抽象策略类的引用,通过这个引用调用具体策略类的方法。环境类可以根据不同的条件或用户的选择,动态地切换具体的策略对象,从而实现不同的行为。
二、策略模式的优势
(一)提高代码的可维护性和可扩展性
当需要添加新的策略时,只需要创建一个新的具体策略类并实现抽象策略接口,而不需要修改现有的代码。这使得代码的维护和扩展变得更加容易,符合开闭原则(Open - Closed Principle),即软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
(二)增强代码的复用性
不同的具体策略类可以被不同的环境类所复用。例如,在一个电商系统中,计算商品折扣的策略可以在订单处理模块和促销活动模块中复用,提高了代码的复用率,减少了代码的冗余。
(三)实现算法的动态切换
在程序运行时,可以根据不同的条件动态地选择不同的策略。比如在一个游戏中,角色可以根据不同的游戏场景和玩家的操作,动态地切换不同的攻击策略,增强了程序的灵活性和适应性。
三、策略模式一般用在什么场景
(一)算法的多样性和可切换性
- 排序算法:在一个数据处理系统中,可能需要对不同类型的数据进行排序,如整数、字符串、自定义对象等。可以使用策略模式,将不同的排序算法(如冒泡排序、快速排序、插入排序等)封装成具体的策略类,根据数据的特点和需求动态地选择合适的排序算法。
- 支付方式:在电商系统中,用户可以选择不同的支付方式,如支付宝、微信支付、银行卡支付等。将每种支付方式封装成一个具体的策略类,在用户下单时,根据用户的选择调用相应的支付策略进行支付操作。
(二)行为的变化和扩展
- 游戏角色行为:在游戏开发中,角色可能有多种行为,如攻击、防御、移动等。不同的角色可以有不同的行为策略,例如战士角色的攻击策略可能是近战高伤害,而法师角色的攻击策略可能是远程魔法攻击。通过策略模式,可以方便地为不同角色定义和切换不同的行为策略。
- 报表生成:在企业应用中,可能需要生成不同格式的报表,如PDF报表、Excel报表、HTML报表等。将每种报表生成方式封装成一个具体的策略类,根据用户的需求选择生成相应格式的报表。
(三)避免多重条件判断
在代码中,如果存在大量的if - else
或switch - case
语句来根据不同的条件执行不同的逻辑,代码会变得复杂且难以维护。使用策略模式可以将这些不同的逻辑封装成具体的策略类,从而避免复杂的条件判断,使代码更加清晰和简洁。
四、Java代码示例
(一)场景设定
假设我们正在开发一个图形绘制程序,需要绘制不同类型的图形,如圆形、矩形、三角形等。每种图形的绘制方式不同,我们可以使用策略模式来实现。
(二)代码实现
- 抽象策略类(ShapeStrategy)
public interface ShapeStrategy {
void draw();
}
- 具体策略类(CircleStrategy、RectangleStrategy、TriangleStrategy)
public class CircleStrategy implements ShapeStrategy {
@Override
public void draw(