策略模式简介
策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口 和 具体行为的实现。策略模
式最大的特点是行为的变化,行为之间可以相互替换。
模式结构
策略模式包含如下角色:
Strategy: 抽象策略类:策略是一个接口,该接口定义若干个算法标识,即定义了若干个抽象方法
Context: 环境类 /上下文类:
上下文是依赖于接口的类,即上下文包含用策略(接口)声明的变量。
上下文提供一个方法,该方法委托策略变量调用具体策略所实现的策略接口中的方法(实现接口的类重写策略(接口)中的方法,来完成具体功能)
ConcreteStrategy: 具体策略类:具体策略是实现策略接口的类。具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体方法。(说白了就是重写策略类的方法!)
抽象类策略
//抽象策略类public interface MemberStrategy {// 一个计算价格的抽象方法//price商品的价格 n商品的个数public double calcPrice(double price, int n);}
具体实现类
public class V1Member implements MemberStrategy{//V1 会员不打折@Overridepublic double calcPrice(double price, int n) {return price * n;}}
public class V2Member implements MemberStrategy{//V2 会员打九折@Overridepublic double calcPrice(double price, int n) {return price * n * 0.9;}}
public class V3Member implements MemberStrategy{//V3 会员打八折@Overridepublic 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、电商网站活动方式,一般分为满减送、限时折扣、包邮活动,拼团等可以采用策略模式
