设计模式-策略模式
2019-08-16 09:11:43来源:博客园 阅读 ()
设计模式-策略模式
这是一个在书上看到的例子,在这里简单记录一下。
1.需求
一个销售书籍的系统,实现:每种书的折扣不一样,教材类的8折,小说类7折,生活类5折,其他的没有折扣。
2.容易想到的解决方法
通常我们会写一个方法计算每种书的价格,代码如下:
private int caculatePrice(String bookType, int originalPrice) {
int price = originalPrice;
if (bookType.equals("教材")){
price = 计算教材价格的算法;
}else if (bookType.equals("小说")){
price = 计算小说价格的算法;
}else if (bookType.equals("生活")){
price = 计算生活价格的算法;
}
return price;
}
3.使用策略模式实现
简单理解:策略模式就是就是为了解决上面这种需求,取代上面这种条件选则语句的实现方式。
如何实现策略模式呢,看图:
上图很容易理解,定义一个计算价格的接口,三种计算价格的算法放到三个实现类(在这个模式中叫策略类)里面,这么容易理解的图就不上代码了(脑补就出来了)。代码脑补出来之后,就可以使用多态的方式来实现对不同价格算法的调用了,多态不是很理解的话 可以看这里。好吧,其实不知道多态的话也很容易看懂的:
PriceCalculator pc = new EDUPriceCalculator(); //超类引用指向子类EDUPriceCalculator对象
pc.caculatePrice(price); //这里调用子类EDUPriceCalculator里面的方法,也就是计算教育类书籍的价格
一般我们都会把上面的代码放到一个客户类里面,所以最终策略模式的代码结构为:一个客户类,一个抽象策略类(接口),若干个具体策略类。最后由客户类决定选择哪一个策略类。上面的类图中已经包含了抽象策略类和具体策略类,还差一个客户类,代码如下:
public class CalculatorClient {
PriceCaculator caculator; //抽象策略接口PriceCaculator的引用
public void setCaculator(PriceCaculator c) {
caculator = c;
}
public void caculatorPrice() {
caculator.caculatorPrice();
}
}
到这里,策略模式已经完成了,使用的时候只需要通过客户类指定调用哪一种算法即可
//首先定义一个客户类
CalculatorClient client = new CalculatorClient();
//动态设定策略类,并调用其算法
EDUPriceCalculator eduCalculator = new EDUPriceCalculator();
client.setCaculator(eduCalculator);
client.caculatorPrice();
//动态设定策略类,并调用其算法
NovelPriceCalculator novelCalculator = new NovelPriceCalculator();
client.setCaculator(novelCalculator);
client.caculatorPrice();
//动态设定策略类,并调用其算法
LifePriceCalculator lifeCalculator = new LifePriceCalculator();
client.setCaculator(lifeCalculator);
client.caculatorPrice();
好了,到这里再看一下策略模式的概念:策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。是不是很容易理解了?
原文链接:https://www.cnblogs.com/developerzjy/p/11083470.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:Prometheus 入门
- 如何干掉 if else 策略+工厂 2020-06-11
- 设计模式-委派/策略模式 2020-06-09
- 深入理解:设计模式中的七大设计原则 2020-06-07
- 设计模式---类之间的关系知多少 2020-06-07
- 你与面试官所了解的单例模式并不一样! 2020-06-06
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