看一遍就会了的策略模式(java)

看一遍就会了的策略模式


在阎宏博士的《JAVA与模式》一书中开头是这样描述策略(Strategy)模式的:

策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。


策略模式的优点:

  • 开闭原则;
  • 避免使用多重条件转移语句;
  • 提高了算法的保密性和安全性:可使用策略模式以避免暴露复杂的,与算法相关的数据结构。

策略模式体现了面向对象程序设计中非常重要的两个原则:

  • 封装变化的概念。
  • 编程中使用接口,而不是使用的是具体的实现类(面向接口编程)。

案例: 用户购物(会员与非会员)

会员与非会员 购买东西时付款会有不同 ,用户出示会员卡,价格会有所优惠

先看下不使用策略模式结局问题

public enum  Role {
    VIP,
    COMMON;
}

public class Test {

    public static void main(String[] args) {
        Role role = Role.VIP;

        int price = 100;

        switch (role) {
            case VIP:
                price *= 0.3;
                break;
            case COMMON:
                price *=0.8;
                break;
        }
        System.out.println(price);
    }
}

以上看着挺简单的,根本不需要用啥设计模式写,但是当业务复杂一点,有很多的角色时,这样switch 会不会有点麻烦了呢


接下来看看使用策略模式来写

先定义一个抽象的策略角色

public interface Strategy {
    // 定义 一个方法 
    int count(int price);
}

在具体的角色去实现这个策略角色

// vip 用户
public class VipStrategy implements Strategy {


    @Override
    public int count(int price) {
        return (int) (price*0.3);
    }
}

// 普通用户
public class CommonStrategy implements Strategy {
    
    @Override
    public int count(int price) {
        return (int) (price * 0.8);
    }
}


定义一个策略操作的类

public class Context {
    
    // 策略对象
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    
    //调用策略方法
    public int count(int price) {
        return strategy.count(price);
    }
}

测试类

public class Test {

    public static void main(String[] args) {
        Context context = new Context(new VipStrategy());
        int count = context.count(100);
        System.out.println(count);

        Context commonContext = new Context(new CommonStrategy());
        int commonCount = commonContext.count(100);
        System.out.println(commonCount);

    }
}


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值