设计模式使用场景实现示例及优缺点(行为型模式——策略模式)

2024-07-16 1250阅读

策略模式(Strategy Pattern)

策略模式(Strategy Pattern)是一种行为设计模式,它能够在运行时选择最适合的算法或行为,同时能够将算法族封装成独立的类,并使它们之间可以相互替换。这种模式是通过创建一个共同的接口,而后将不同的行为或算法封装在不同的策略类中实现的。每个策略类都遵循相同的接口,从而保持策略的独立性与互换性。

设计模式使用场景实现示例及优缺点(行为型模式——策略模式)
(图片来源网络,侵删)

核心组件

  • Strategy(策略接口):这是一个共同的接口,它定义了所有支持的算法的抽象方法。任何具体策略都必须实现这个接口。
  • ConcreteStrategy(具体策略):实现策略接口的类,提供具体的算法实现。
  • Context(上下文):用来维护对策略对象的引用,它可以定义一个接口,让策略对象根据上下文来选择适当的算法。

    适用场景

    1. 多种算法或行为:
      • 当一个类存在多种行为,且使用条件时,可以将这些行为封装成不同的策略。
      • 避免使用多重条件选择语句:
        • 使用策略模式可以避免使用多重条件选择语句,这样可以更容易维护和扩展。
        • 需要动态地改变算法或行为:
          • 当算法或行为需要经常改变时,使用策略模式可以提供更好的代码组织和重新使用。
          • 行为变化独立于使用行为的客户:
            • 需要将行为与客户代码解耦,使得行为的改变不会影响客户代码。

    实现实例

    以电商系统的支付功能为例,假设需要支持多种支付方式(如信用卡、PayPal、比特币等)。使用策略模式可以定义一个支付接口(PaymentStrategy),并为每种支付方式实现一个具体的策略类。上下文(PaymentContext)可以持有一个支付策略引用,根据不同的用户选择使用不同的支付策略:

    策略接口(Strategy Interface)

    这个接口定义了所有支持的算法或行为的抽象方法。每个具体的策略类都必须实现这个接口。

    public interface PaymentStrategy {
        void pay(int amount);  // 定义支付行为的方法,每种支付策略都需要实现这个方法
    }
    
    具体策略类(Concrete Strategy Classes)

    这些类实现了策略接口,并提供了具体的算法实现。

    public class CreditCardStrategy implements PaymentStrategy {
        public void pay(int amount) {
            System.out.println("Paid " + amount + " using Credit Card");  // 信用卡支付实现
        }
    }
    public class PayPalStrategy implements PaymentStrategy {
        public void pay(int amount) {
            System.out.println("Paid " + amount + " using PayPal");  // PayPal支付实现
        }
    }
    public class BitcoinStrategy implements PaymentStrategy {
        public void pay(int amount) {
            System.out.println("Paid " + amount + " using Bitcoin");  // 比特币支付实现
        }
    }
    
    上下文类(Context Class)

    这个类用于维护对策略对象的引用。它可以定义一个方法让策略对象根据上下文来选择适当的算法。

    public class PaymentContext {
        private PaymentStrategy strategy;  // 维护一个对策略对象的引用
        public PaymentContext(PaymentStrategy strategy) {
            this.strategy = strategy;  // 构造函数中设置策略对象
        }
        public void setStrategy(PaymentStrategy strategy) {
            this.strategy = strategy;  // 允许在运行时改变策略
        }
        public void executePayment(int amount) {
            strategy.pay(amount);  // 执行支付,具体行为取决于策略对象
        }
    }
    
    客户端代码(Client Code)

    这部分代码演示了如何使用策略模式来改变对象的行为。

    public class Client {
        public static void main(String[] args) {
            PaymentContext context = new PaymentContext(new CreditCardStrategy());
            context.executePayment(100);  // 使用信用卡策略支付100
            context.setStrategy(new PayPalStrategy());
            context.executePayment(200);  // 更改策略为PayPal并支付200
            context.setStrategy(new BitcoinStrategy());
            context.executePayment(300);  // 更改策略为比特币并支付300
        }
    }
    

    优缺点

    优点
    1. 封装性好:
      • 策略模式将每个变化的策略封装到独立的类中,使得每个策略可以独立于客户端实现变化。
      • 易于扩展:
        • 策略模式提供了一种扩展机制,新的策略类可以很容易地添加进现有系统中。
        • 避免使用多重条件选择语句:
          • 策略模式允许动态地改变行为,客户端仅需更改配置,无需修改代码。
    缺点
    1. 客户端必须知道所有策略:
      • 客户端需要了解所有的策略类,并自行决定使用哪一个策略类。
      • 策略族的增多:
        • 随着策略族的增加,各种策略类的数目也会增加,每个策略都需要对外暴露,这就增加了系统的复杂性。

    类图

    +----------------+         +------------------+
    |     Context    |-------->|     Strategy     |
    +----------------+         +------------------+
    | - strategy:    |         | + execute()      |
    |   Strategy     |         +------------------+
    | + setStrategy()|                 ^
    | + execute()    |                 |
    +----------------+                 |
                                       |
          +-------------------+--------+--------+----------------+
          |                   |                 |                |
    +---------------+ +-----------------+ +----------------+ +--------------+
    |ConcreteStrategyA| |ConcreteStrategyB| |ConcreteStrategyC| | ...          |
    +---------------+ +-----------------+ +----------------+ +--------------+
    | + execute()   | | + execute()     | | + execute()    | | + execute()   |
    +---------------+ +-----------------+ +----------------+ +--------------+
    

    总结

    策略模式提供了一种灵活的方式来切换对象的行为,增强了代码的可维护性和扩展性。它帮助将行为封装为对象,可以在运行时互换,这使得它在需要支持多种行为的系统中非常有用。这种模式特别适合于那些算法或行为多样化的场景,可以有效地帮助系统遵守开闭原则,即对扩展开放,对修改关闭。通过策略模式,程序员可以方便地添加新的策略而不影响现有的系统,并且能够在运行时动态地改变对象的行为。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]