JAVA设计模式——策略模式

目录

1.什么是策略模式

2.策略模式结构

3.代码示例(支付策略)


1.什么是策略模式

策略模式属于行为设计模式,其主要是将同一行为下的不同算法策略(如支付行为下的现金支付、微信支付、支付宝支付等策略)封装到实现共同接口的独立子类中,从而使得它们可以相互替换。

策略模式使得算法可以在不影响到客户端的情况下发生变化。其主要目的是通过定义相似的算法,替换if else 语句写法,并且可以随时相互替换。

所以,他的优点很明显,就是可以替换掉冗余的if else和switch代码块,同时避免重复的代码。

2.策略模式结构

一般来说,策略模式包括以下三种角色:

  • 环境上下文(Context)角色:持有一个Strategy引用,委托策略变量调用具体策略所实现的策略接口中的方法。
  • 策略(Strategy)角色:抽象角色,通常由一个接口或抽象类实现,此角色给出所有的具体策略类所需接口。
  • 具体策略(ConcreteStrategy)角色:具体实现策略接口的类,包装了相关的算法或行为。

 

 简单来说就是,一个行为接口规定其行为类型性质,然后一些继承该接口的算法类,最后一个策略上下文,在此上下文中根据情况选择策略,并执行。

3.代码示例(支付策略)

下面以支付策略模式为例,编写相关代码:

(1)定义策略(Strategy)角色:Payment

public interface Payment {
    void pay(double number);
}

(2)编写相关策略(微信、支付宝):

public class WechatPay implements Payment{
    @Override
    public void pay(double number) {
        System.out.println("这里是微信支付,支付金额:"+number);
    }
}
public class ZhifubaoPay implements Payment{
    @Override
    public void pay(double number) {
        System.out.println("这里是支付宝支付,支付金额:"+number);
    }
}

(3)创建一个行为随着策略对象改变而改变的 context 对象:

public class PayContext {
    private static final Map<String,Payment> payMap = new HashMap<String, Payment>(){{
        put("1",new WechatPay());
        put("2",new ZhifubaoPay());
    }};

    /**
     * 支付策略选择方法
     * @param payFlag   支付策略标识
     */
    public void payChoose(String payFlag){
        //根据标识,选择对应的策略
        Payment payment = payMap.get(payFlag);
        //执行策略
        payment.pay(20.0);
    }
}

注意:此处维护了一个payMap,对支付标识和对应策略进行了映射,以便以后可以进行动态维护。当我们需要添加新的支付策略时,只需要在该map中添加标识和对应的策略类即可。

(4)最后,我们进行测试:

public class Test {
    public static void main(String[] args) {
        //选择1标识符,进行微信支付
        new PayContext().payChoose("1");
        //选择2标识符,进行支付宝支付
        new PayContext().payChoose("2");
    }
}

执行结果:

成功根据传递的标识,调用对应的策略。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
策略模式(Strategy Pattern)是Java设计模式的一种行为型模式,它定义了一系列的算法,并将每个算法封装在独立的类,使得它们可以互相替换。这样可以使得算法的变化独立于使用它们的客户端。 在策略模式,有三个主要角色: 1. 环境类(Context):持有一个策略类的引用,用于调用具体的策略。 2. 抽象策略类(Strategy):定义了一个公共接口或抽象类,用于具体策略类的统一调用。 3. 具体策略类(Concrete Strategy):实现了抽象策略类定义的接口或抽象类,提供具体的算法实现。 使用策略模式可以实现算法的动态切换,增加新的算法也不会影响到已有的代码。例如,假设我们需要实现一个排序算法,可以定义一个抽象策略类 SortStrategy,然后具体的排序算法(如快速排序、归并排序等)分别实现 SortStrategy,并在环境类持有 SortStrategy 的引用。这样,通过更换不同的 SortStrategy 对象,就可以在运行时选择不同的排序算法。 策略模式能够有效地解耦策略的定义和使用,提高代码的灵活性和可维护性。同时,它也符合面向对象设计原则的"开闭原则"(对扩展开放,对修改关闭)和"单一职责原则"(一个类应该只有一个引起变化的原因)。 希望这个简要的介绍能够帮助到你对策略模式的理解。如果还有其他问题,可以继续提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值