策略模式(易懂) 淡淡的烟草味﹌ 2022-01-06 09:37 138阅读 0赞 -------------------- <table> <tbody> <tr> <td style="text-align:center;"><span style="color:#000000;font-family:'黑体';font-size:18pt;">策略模式</span></td> </tr> </tbody> </table> -------------------- * 策略模式:也叫作政策模式,定义一组算法,将每个算法都封装起来,并且使他们之间可以互换 * 策略模式的使用就是面向对象的继承和多态机制,其通用类图如下: ![786913-20161119161840310-1117065784.png][] * * Context封装角色,也叫作上下文角色,屏蔽高层模块对策略、算法的直接访问,封装可能的变化。 * Istrategy抽象策略角色,策略算法家族的抽象,通常为接口定义每个算法必须具有的方法和属性。 * ConcreteStrategy具体策略角色,实现抽象策略中的操作该类含有具体的算法。 通用类图的源码如下: * * ![复制代码][copycode.gif] public interface IStrategy { //定义具体策略必须具有的方法 public void doSomething(); } public class ConcreteStrategy1 implements IStrategy{ public void doSomething(){ System.out.println("this is a concreteStrategy"); } } public class ConcreteStrategy2 implements IStrategy{ @Override public void doSomething() { // TODO Auto-generated method stub System.out.println("This is concreteStrategy2"); } } public class Context { private IStrategy strategy = null; public Context(IStrategy strategy){ this.strategy = strategy; } public void doSomething(){ this.strategy.doSomething(); } } public class Client { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Context text = new Context(new ConcreteStrategy2()); text.doSomething(); text = new Context(new ConcreteStrategy1()); text.doSomething(); } } ![复制代码][copycode.gif] <table> <tbody> <tr> <td><span style="font-family:'黑体';font-size:14pt;color:#ffffff;">策略模式的优缺点</span></td> </tr> </tbody> </table> * 策略模式的优点 * 算法可以自由的切换,通过实现抽象策略,通过封装角色对其封装,保证对外提供“可自由切换”的策略。 * 避免使用多重条件判断,如果有多重策略,那么每个策略只需实现自己的方法,至于采用何种策略,可以通过其他模块决定。 * 扩展性良好,可以在现有的系统中任意的加入新的策略,只需继承IStrategy接口,符合OCP原则。 * 策略模式的缺点 * 策略类数量增多,每个策略都是一个类,复用的可能性很小,类数量增多 * 所有的策略都需要对外暴露,上层模块必须知道有哪些策略,然后才能知道采用哪种策略,可以通过使用工厂方法模式、代理模式和享元模式修正。 <table> <tbody> <tr> <td><span style="color:#ffffff;font-family:'黑体';font-size:14pt;">策略模式的扩展(工厂方法模式+策略模式)</span></td> </tr> </tbody> </table> 首先策略枚举StrategyMan,负责对具体策略的映射,然后建立一个简单的工厂,根据策略管理类的枚举项创建一个策略对象,简单而实用,策略模式的缺陷得到了弥补。其通用类图如下: ![786913-20161120105703935-937767446.png][] ![ExpandedBlockStart.gif][] ![复制代码][copycode.gif] public enum StrategyMan { Strategy1("com.strategy.ConcreteStrategy1"), Strategy2("com.strategy.ConcreteStrategy2"); String value = ""; private StrategyMan(String value){ this.value = value; } public String getValue(){ return this.value; } } public class StrategyFactory { public static IStrategy getStrategy(StrategyMan strategyman){ IStrategy strategy = null; try { strategy = (IStrategy) Class.forName(strategyman.getValue()).newInstance(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return strategy; } } public class StrategyFacade { public void doSomething(String str){ StrategyMan sMan = null; if(str.equalsIgnoreCase("Strategy1")){ sMan = StrategyMan.Strategy1; }else if(str.equalsIgnoreCase("Strategy2")){ sMan = StrategyMan.Strategy2; } IStrategy strategy = StrategyFactory.getStrategy(sMan); Context context = new Context(strategy); context.doSomething(); } } public class Client { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub StrategyFacade sFacade = new StrategyFacade(); sFacade.doSomething("Strategy1"); } } ![复制代码][copycode.gif] https://www.cnblogs.com/zhanglei93/p/6081019.html 转载于:https://www.cnblogs.com/MaxElephant/p/10769026.html [786913-20161119161840310-1117065784.png]: /images/20211227/fc37dd2cb765477eb1415764be14e43f.png [copycode.gif]: /images/20211227/739a0d498a3448cf92fcff9a7c98a4ae.png [786913-20161120105703935-937767446.png]: /images/20211227/0ee601ef26fd483193a210b23516e26e.png [ExpandedBlockStart.gif]: /images/20211227/b15a896df7604f4e83e0106d88521ee9.png
相关 设计模式之策略模式 通俗易懂 策略模式 (Strategy Pattern): 策略模式定义了一系列算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户端。把 左手的ㄟ右手/ 2022年12月18日 10:57/ 0 赞/ 162 阅读
相关 策略模式(易懂) -------------------- <table> <tbody> <tr> <td style="text-align:center;"><span 淡淡的烟草味﹌/ 2022年01月06日 09:37/ 0 赞/ 139 阅读
相关 策略模式 前言 1、面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同的属性和功能的对象的抽象集合才是类。 2、简单工厂也能解决问题,但是 港控/mmm°/ 2021年12月08日 16:21/ 0 赞/ 308 阅读
相关 策略模式 用了也不知道用了的典型。 就是接口存在的意义,意图和实现分离。 就好像1+1=2,实现了一个简单加法一样。。。 转载于:https://www.cnblogs.com/l 曾经终败给现在/ 2021年11月27日 06:14/ 0 赞/ 295 阅读
相关 策略模式 策略模式 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略 亦凉/ 2021年09月29日 15:56/ 0 赞/ 283 阅读
相关 策略模式 13.策略模式 class Program { static void Main(string[] args) 本是古典 何须时尚/ 2021年09月17日 00:00/ 0 赞/ 394 阅读
相关 策略模式 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为 忘是亡心i/ 2021年09月16日 23:00/ 0 赞/ 432 阅读
相关 策略模式 策略模式 1. 模式动机 2. 模式定义 3. 模式结构 4. 时序图 5. 代码分析 6. 模式分析 7. 优点 8. 深碍√TFBOYSˉ_/ 2021年08月31日 02:47/ 0 赞/ 531 阅读
相关 策略模式 面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。 策略模式:定义了算法家族,分别封装起来,让它们之间... 灰太狼/ 2020年11月29日 04:23/ 0 赞/ 601 阅读
还没有评论,来说两句吧...