前言
策略模式(Strategy Pattern)是一种行为计划模式,它界说了一系列算法,将每个算法封装起来,并使它们可以相互更换。策略模式让算法的变革独立于利用算法的客户端。通过这种方式,可以避免利用大量的 if-else 或 switch 语句来处置惩罚不同的行为,而是通过策略接口和不同的策略实现类来封装每一种行为。
策略模式的焦点思想是将每个算法(或策略)封装成一个独立的类,并让这些类可以互换利用。这使得系统更加机动、扩展性更强。
1.策略模式的组成
- Context(上下文):利用某个策略类的对象。
- Strategy(策略接口):界说所有支持的算法的公共接口。
- ConcreteStrategy(具体策略类):实现了策略接口的具体算法。
2.策略模式的利用场景
- 当一个系统需要在多种算法中动态选择一种时:例如,不同的支付方式(信用卡支付、支付宝支付、微信支付等)可以用策略模式进行实现,每种支付方式可以看作一个独立的策略。
- 当需要消除条件语句以提高代码可读性和可维护性时:例如,一个复杂的税务计算系统,可以根据不同地域、不同类型的商品利用不同的税率策略。
3.策略模式实现案例
3.1 界说策略接口
界说一个支付策略接口 PaymentStrategy,其中包含一个支付方法 pay。
- // 策略接口
- public interface PaymentStrategy {
- void pay(double amount);
- }
复制代码 3.2 实现具体策略类
实现具体的支付策略类,如信用卡支付、支付宝支付和微信支付。
- // 具体策略类 - 信用卡支付
- public class CreditCardPayment implements PaymentStrategy {
- // 定义一些类变量
- private String cardNumber;
- private String name;
- private String expiryDate;
- public CreditCardPayment(String cardNumber, String name, String expiryDate) {
- this.cardNumber = cardNumber;
- this.name = name;
- this.expiryDate = expiryDate;
- }
- @Override
- public void pay(double amount) {
- System.out.println(amount + "使用信用卡支付");
- }
- }
- // 具体策略类 - 支付宝支付
- public class AlipayPayment implements PaymentStrategy {
- // 定义一些类变量
- private String email;
- public AlipayPayment(String email) {
- this.email = email;
- }
- @Override
- public void pay(double amount) {
- System.out.println(amount + "使用支付宝支付");
- }
- }
- // 具体策略类 - 微信支付
- public class WeChatPayment implements PaymentStrategy {
- // 定义一些类变量
- private String phoneNumber;
- public WeChatPayment(String phoneNumber) {
- this.phoneNumber = phoneNumber;
- }
- @Override
- public void pay(double amount) {
- System.out.println(amount + "使用微信支付");
- }
- }
复制代码 3.3 界说上下文类
界说一个上下文类 PaymentContext,用于设置和利用支付策略。
- // 上下文类
- public class PaymentContext {
- private PaymentStrategy paymentStrategy;
- public PaymentContext(PaymentStrategy paymentStrategy) {
- this.paymentStrategy = paymentStrategy;
- }
- public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
- this.paymentStrategy = paymentStrategy;
- }
- public void executePayment(double amount) {
- paymentStrategy.pay(amount);
- }
- }
复制代码 3.4 利用策略示例
在客户端代码中,创建不同的支付策略实例,并在上下文中利用它们。
- public class StrategyPatternDemo {
- public static void main(String[] args) {
- double amount = 100.0;
- // 使用信用卡支付
- PaymentStrategy creditCardPayment = new CreditCardPayment("1234-5678-9012-3456", "John", "2024/11/11");
- PaymentContext context = new PaymentContext(creditCardPayment);
- context.executePayment(amount);
- // 使用支付宝支付
- PaymentStrategy alipayPayment = new AlipayPayment("test001@163.com");
- context.setPaymentStrategy(alipayPayment);
- context.executePayment(amount);
- // 使用微信支付
- PaymentStrategy weChatPayment = new WeChatPayment("13412345678");
- context.setPaymentStrategy(weChatPayment);
- context.executePayment(amount);
- }
- }
复制代码 输出结果:
- 100.0 使用信用卡支付
- 100.0 使用支付宝支付
- 100.0 使用微信支付
复制代码 4. 策略模式的优缺点
长处
- 封装变革:策略模式可以将不同的行为封装成独立的策略类,避免代码中直接利用条件判断语句(如 if、switch)来切换不同的行为。
- 代码复用:具体的策略类可以在不同的上下文情况中共享和复用。
- 易于扩展:添加新的策略时,只需新增一个具体策略类即可,不需要修改现有代码,符合开闭原则。
- 减少了客户端的复杂性:客户端只需要知道怎样设置策略,而不需要关心具体策略的实现。
缺点
- 增长了类的数量:每一个策略都会对应一个新的类,如果策略很多时,类的数量会大幅增长。
- 客户端需要知道所有的策略:客户端需要了解所有可用的策略并在运行时选择合适的策略。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |