title: 浅析Java设计模式【3.4】——策略
date: 2018-12-29 17:26:17
categories: 设计模式
description: 浅析Java设计模式【3.4】——策略
1. 目录
2. 概念
策略的设计模式属于行为型模式一种,通过定义的一套算法类,进行封装,让算法类之间可以相互替换,从而达到一种按照调用侧/实现侧去决定目标实现。策略模式可以最大程度的避免代码中 if else
以及 switch
语句。
2.1. 应用场景
- 在需要多实现场景下,但只在算法或行为上略有差异
- 在算法或行为上须自由完成切换
- 需要解脱或者屏蔽多条件判断的场景
2.2. 优缺点
2.2.1. 优点
- 算法或行为可自由切换
- 避免在实现过程中,使用多重条件判断
- 实现结构上具备扩展性良好和可读性
2.2.2. 缺点
- 策略的基础条件随着业务增长会增多,可能存在臃肿
- 不是很安全,因为所有的策略条件都对外暴露
3. 模式结构
策略模式 的实现包含三个组成部分,分别为 策略类
、 具体策略类
、 上下文
。
- Strategy:策略类,用于定义所有支持算法的公共接口;
- ConcreteStrategy:是具体策略类,封装了具体的算法或行为,继承于
Strategy
。 - Context:是上下文,用一个
ConcreteStrategy
来配置,维护一个对Strategy
对象的引用
4. 样例
此处假定我们在商场购物,用户支付的环节,在用户支付过程中,我们可以选择 现金
、信用卡
、积分
。
4.1. 定义策略
public interface Payment {
void payment();
}
4.2. 定义具体策略
- 现金
public class Cash implements Payment{
@Override
public void payment() {
System.out.println("现金付款");
}
}
- 信用卡
public class Credit implements Payment{
@Override
public void payment() {
System.out.println("信用卡付款");
}
}
- 积分
public class Points implements Payment{
@Override
public void payment() {
System.out.println("积分付款");
}
}
4.3. 定义上下文
public class Shopping {
private Payment payment;
public Shopping(Payment payment) {
this.payment = payment;
}
public void buyDesktop(){
System.out.println("购买台式机");
payment.payment();
}
}
4.4. 实现效果
@DisplayName("策略应用")
@Test
public void testStrategy() {
Payment payment = new Cash();
Shopping shopping = new Shopping(payment);
shopping.buyDesktop();
}