什么是策略模式?使用的场景和例子

概念

在策略模式中,我们自己定义多个算法,将他们封装成一个个类,实现同一个接口,使他们可以相互替换。可以解决多个算法相似的情况下会有很多的else if存在,扩展性比较好。

策略模式的三个角色:

  • 环境(Context):Context是维护一个对策略对象的引用,并在需要时将客户端请求委托给具体的策略对象执行,Context不负责具体的实现,通过调用策略对象的方法来完成对应的操作。
  • 抽象策略(Abstract Strategy):定义了策略对象的公共接口或者抽象类,规定了具体策略类必须实现的方法。
  • 具体模式(Concrete Strategy):实现了抽象策略定义的接口或者抽象类,包含了具体的算法实现。

场景

现在的每个人都有银行卡,一个人可能拥有一张银行卡,也可能拥有四张五张银行卡甚至更多,那我们支付的时候选择使用哪张银行卡支付呢?

不使用策略模式的是什么样的

下面演示不使用策略模式的情况。

package com.example.springBootMyBatis.designMode.strategy;

/**
 * 银行卡类
 *
 * @author 赵东洋
 */
public class bankCard {
    public static void otUsedStrategy(bankCardType type) {
        if (bankCardType.GSYH == type) {
            System.out.println("这里使用的是工商银行");
        } else if (bankCardType.NSYH == type) {
            System.out.println("这里使用的是农商银行");
        } else if (bankCardType.ZGYH == type) {
            System.out.println("这里使用的是中国银行");
        } else {
            System.out.println("没有该银行");
        }
        /*
         * ................
         * 后面如果新增更多的银行卡类型,需要继续添加else if判断,这里只是简单演示一下,
         * 如果是实际的业务开发,代码量会非常大,这
         */
    }

    /**
     * 银行卡类型枚举
     */
    public enum bankCardType {
        /**
         * 工商银行
         */
        GSYH,
        /**
         * 农商银行
         */
        NSYH,
        /**
         * 中国银行
         */
        ZGYH;
    }
}

使用策略模式

创建一个银行卡策略接口

package com.example.springBootMyBatis.designMode.strategy;

/**
 * 银行卡策略
 * @author 赵东洋
 */
public interface BankCardStrategy {
    /**
     * 银行卡接口
     */
    public String bankCard();
}

其他的银行去实现这个接口

# 工商银行实现
package com.example.springBootMyBatis.designMode.strategy;

/**
 * 工商银行 银行策略
 * @author 赵东洋
 */
public class GSYHBankCard implements BankCardStrategy {
    @Override
    public String bankCard() {
        return "使用工商银行银行卡";
    }
}

# 农商银行实现
package com.example.springBootMyBatis.designMode.strategy;

/**
 * 农商银行 银行卡策略
 * @author 赵东洋
 */
public class NSYHBankCard implements BankCardStrategy{
    @Override
    public String bankCard() {
        return "使用农商银行银行卡";
    }
}

# 中国银行实现
package com.example.springBootMyBatis.designMode.strategy;

/**
 * 中国银行 银行卡策略
 * @author 赵东洋
 */
public class ZGYHBankCard implements BankCardStrategy{
    @Override
    public String bankCard() {
      return "这里使用中国银行银行卡";
    }
}

创建Context

package com.example.springBootMyBatis.designMode.strategy;

/**
 * 维护对象策略的引用
 *
 * @author 赵东洋
 */
public class Context {

    private BankCardStrategy bankCardStrategy;

    /**
     * 构造器
     */
    public Context(BankCardStrategy bankCardStrategy) {
        this.bankCardStrategy = bankCardStrategy;
    }

    /**
     * 执行策略
     */
    public String executeStrategy() {
        return bankCardStrategy.bankCard();
    }
}

创建测试类,使用Context查看改变Strategy的行为变化。

package com.example.springBootMyBatis.designMode.strategy;

/**
 * 测试
 *
 * @author 赵东洋
 */
public class Test {
    public static void main(String[] args) {
        /*
         * 使用工商银行
         */
        Context gs = new Context(new GSYHBankCard());
        System.out.println(gs.executeStrategy());
        /*
         * 使用农商银行
         */
        Context ns = new Context(new NSYHBankCard());
        System.out.println(ns.executeStrategy());
        /*
         * 使用中国银行
         */
        Context zh = new Context(new NSYHBankCard());
        System.out.println(zh.executeStrategy());
    }
}

输出结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值