结合案例深入解析策略模式
2019-06-13 09:02:29来源:博客园 阅读 ()
一、基本概念
策略模式是行为型设计模式。
其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。
策略模式使得算法可以在不影响到客户端的情况下发生变化。
二、结构
下面是基本结构:
三类角色:
- 环境(Context)角色:持有一个
Strategy
的引用。 - 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
- 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
三、案例
案例实现:
定义一族算法,可以实现对两个数的操作,例如+、-、*、/
等。
实现代码整体框架图:
具体代码实现:
Context
类:
/** * Context 是一个使用了某种策略的类。 实现了 Strategy 接口的实体策略类 */ public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public int executeStrategy(int num1, int num2){ return strategy.doOperation(num1, num2); } } Strategy接口: /**策略的公共接口*/ public interface Strategy { int doOperation(int num1, int num2); }
三种对应的算法实现:
/** 算法1: 实现加法 */ public class OperationAdd implements Strategy { @Override public int doOperation(int num1, int num2) { return num1 + num2; } } /** 算法2:实现减法 */ public class OperationSubstract implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 - num2; } } /** 算法3: 实现乘法 */ public class OperationMultiply implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 * num2; } }
测试类:
public class MyTest { public static void main(String[] args) { Context context = new Context(new OperationAdd()); System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); context = new Context(new OperationSubstract()); System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); context = new Context(new OperationMultiply()); System.out.println("10 * 5 = " + context.executeStrategy(10, 5)); } }
程序输出:
10 + 5 = 15 10 - 5 = 5 10 * 5 = 50
四、总结
- 策略模式的重心不是如何实现算法,而是如何组织、调用这些算法;
- 策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是完全一样的,正因为这个平等性,才能实现算法之间可以相互替换;
- 使用策略模式可以避免使用多重条件(if-else)语句;
免费Java高级资料需要自己领取,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程,一共30G。
传送门:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q
原文链接:https://www.cnblogs.com/yuxiang1/p/11016999.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:面试总结
- Java--反射(框架设计的灵魂)案例 2020-06-11
- Dubbo+Zookeeper集群案例 2020-06-09
- 深入解析ThreadLocal和ThreadLocalMap 2020-06-08
- 深入理解:设计模式中的七大设计原则 2020-06-07
- 深入浅出 Java 类加载机制! 2020-06-05
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash