ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
* * [TOC] | | | | --- | --- | | | | [TOC] # 策略模式(Strategy Pattern) 策略模式又叫政策模式(Policy Pattern),它是将定义的算法家族分别封装起来,让它们之间可以互相替换,从而让算法的变化不会影响到使用算法的用户。可以避免多重分支的if......else和switch语句。 策略模式的主要角色如下: * 抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。 * 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现或行为。 * 环境(Context)类:持有一个策略类的引用,最终给客户端调用。 ![](https://img.kancloud.cn/ff/2b/ff2bbdb86e17de13d5017224b972faed_1647x581.png) ## 1 普通案例(会员卡打折) ``` // 会员卡接口 public interface VipCard { public void discount(); } public class GoldCard implements VipCard { @Override public void discount() { System.out.println("金卡打7折"); } } public class SilverCard implements VipCard { @Override public void discount() { System.out.println("银卡打8折"); } } public class CopperCard implements VipCard { @Override public void discount() { System.out.println("铜卡打9折"); } } public class Normal implements VipCard { @Override public void discount() { System.out.println("普通会员没有折扣"); } } // 会员卡容器类 public class VipCardFactory { private static Map<String, VipCard> map = new ConcurrentHashMap<>(); static { map.put("gold", new GoldCard()); map.put("silver", new SilverCard()); map.put("copper", new CopperCard()); } public static VipCard getVIPCard(String level) { return map.get(level) != null ? map.get(level) : new Normal(); } } // 测试方法 public static void main(String[] args) { //金卡打7折 VipCardFactory.getVIPCard("gold").discount(); //银卡打8折 VipCardFactory.getVIPCard("silver").discount(); //普通会员没有折扣 VipCardFactory.getVIPCard("other").discount(); } ``` 用一个容器(Map)装起来,可以通过传进来的参数直接获取对应的策略,避免了if...else。 ## 2. 总结 适用场景: * 系统中有很多类,而它们的区别仅仅在于它们的行为不同。 * 系统需要动态地在几种算法中选择一种。 * 需要屏蔽算法规则。 优点: * 符合开闭原则。 * 避免使用多重条件语句。 * 可以提高算法的保密性和安全性。 * 易于扩展。 缺点: * 客户端必须知道所有的策略,并且自行决定使用哪一个策略类。 * 代码中会产生非常多的策略类,增加维护难度。