策略模式简介
策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口 和 具体行为的实现。策略模
式最大的特点是行为的变化,行为之间可以相互替换。
模式结构
策略模式包含如下角色:
Strategy: 抽象策略类:策略是一个接口,该接口定义若干个算法标识,即定义了若干个抽象方法
Context: 环境类 /上下文类:
上下文是依赖于接口的类,即上下文包含用策略(接口)声明的变量。
上下文提供一个方法,该方法委托策略变量调用具体策略所实现的策略接口中的方法(实现接口的类重写策略(接口)中的方法,来完成具体功能)
ConcreteStrategy: 具体策略类:具体策略是实现策略接口的类。具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体方法。(说白了就是重写策略类的方法!)
抽象类策略
//抽象策略类
public interface MemberStrategy {
// 一个计算价格的抽象方法
//price商品的价格 n商品的个数
public double calcPrice(double price, int n);
}
具体实现类
public class V1Member implements MemberStrategy{
//V1 会员不打折
@Override
public double calcPrice(double price, int n) {
return price * n;
}
}
public class V2Member implements MemberStrategy{
//V2 会员打九折
@Override
public double calcPrice(double price, int n) {
return price * n * 0.9;
}
}
public class V3Member implements MemberStrategy{
//V3 会员打八折
@Override
public double calcPrice(double price, int n) {
return price * n * 0.8;
}
}
上下文类
//上下文类
public class MemberContext {
//策略接口
private MemberStrategy memberStrategy;
//调用构造方法
public MemberContext(MemberStrategy memberStrategy){
this.memberStrategy = memberStrategy;
}
// 计算价格
public double Price(double price, int n){
return memberStrategy.calcPrice(price, n);
}
}
测试类
//测试类
public class TestStrategy {
public static void main(String[] args) {
// 创建会员的实例 具体行为策略
MemberStrategy v1 = new V1Member(); //向上转型 面向接口编程
MemberStrategy v2 = new V2Member();
MemberStrategy v3 = new V3Member();
// 用户选择不同策略
MemberContext v1c = new MemberContext(v1);
MemberContext v2c = new MemberContext(v2);
MemberContext v3c = new MemberContext(v3);
//计算一本300块钱的书
System.out.println("初级会员的价格: "+v1c.Price(300, 1));
System.out.println("中级会员的价格: "+v2c.Price(300, 1));
System.out.println("高级会员的价格: "+v3c.Price(300, 1));
}
}
输出:
初级会员的价格: 300.0
中级会员的价格: 270.0
高级会员的价格: 240.0
策略模式优缺点
优点
策略模式提供了对 开闭原则 的完美实现 ,用户可以在不修改原有系统的基础上选择算法或者行为,也可以灵活的增加 新的算法或行为
缺点
客户端必须知道所有的策略类,并自行决定使用哪一个类
策略模式产生很多策略类,可以通过使用享元模式 在一定程度上减少对象的数量
策略模式适用的场景
1、电商网站支付方式,一般分为银联、微信、支付宝,可以采用策略模式
2、电商网站活动方式,一般分为满减送、限时折扣、包邮活动,拼团等可以采用策略模式