博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
策略模式
阅读量:7198 次
发布时间:2019-06-29

本文共 2157 字,大约阅读时间需要 7 分钟。

hot3.png

在开发中,有时候实现一个功能有多种方法或者说是策略,在实现的过程中可以根据条件来进行选择不同的方法或者策略,比如对一个集合进行排序,可以根据客户端传进来的条件来选择不同的排序算法,如冒泡排序,堆排序,快速排序......等。

对于这种需求,一般的解决办法就是在一个方法中 通过 if....else if....else 或者 switch case 来解决,这样有一点不好的地方,如果我们要添加一个新的算法,或者删除一个已有的算法,则必须要修改源代码来实现,去掉/添加一个 else 分支或者 case分支,代码的扩展性和维护性较差,对于这种需求的话,可以使用策略模式来进行解决。

策略模式  :

定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。

下面以一个网购付款方式为例进行说明:

在网购付款的时候,可以选择的付款方式有很多种,如支付宝,微信,信用卡和 ApplePay等。

首先定义抽象策略类PayWay

public abstract class PayWay {		public abstract boolean pay(double money);	}

定义具体策略类

支付宝支付类:

/** * 支付宝支付 * @author Administrator * */public class AlPay extends PayWay{	@Override	public boolean pay(double money) {		System.out.println(String.format("使用支付宝成功付款:%f", money));		return true;	}}

微信支付类:

/** * 微信支付 * @author Administrator * */public class WeChatPay extends PayWay{	@Override	public boolean pay(double money) {		System.out.println(String.format("使用微信成功付款:%f", money));		return true;	}}

信用卡支付类:

/** * 信用卡支付 * @author Administrator * */public class CreditCardPay extends PayWay{	@Override	public boolean pay(double money) {		System.out.println(String.format("使用信用卡成功付款:%f", money));		return true;	}}

客户端类

在客户端类中,只需持有抽象策略类的一个引用。

class Client{	private PayWay payWay = null;		public void setPayWay(PayWay payWay) {		this.payWay = payWay;	}		public void pay(double money){		payWay.pay(money);	}}

测试:

public static void main(String[] args) {		Client client = new Client();		// 支付宝		client.setPayWay(new AlPay());		client.pay(1000);				//微信		client.setPayWay(new WeChatPay());		client.pay(1000);				//信用卡		client.setPayWay(new CreditCardPay());		client.pay(1000);	}

结果:

使用支付宝成功付款:1000.000000使用微信成功付款:1000.000000使用信用卡成功付款:1000.000000

现在如果想添加一种新的付款方式,ApplePay,只需新加一个类,继承抽象策略类即可,

ApplePay类:

/** * ApplePay支付 * @author Administrator * */public class ApplePay extends PayWay{	@Override	public boolean pay(double money) {		System.out.println(String.format("使用苹果成功付款:%f", money));		return true;	}}

可以看到,新添加一个策略或者算法,对原来的代码没有改动,只是新加了一个类而已,如果想不使用某个算法或策略,如不想使用信用卡支付,则在客户端进行调用的时候,不传入 CreditCardPay对象即可,对原来的代码也没有改动,由此可以看到维护性和扩展性较高。

缺点:

策略模式也有它的缺点,如客户端在进行调用的时候,必须知道每个算法或者策略的不同;如果策略很多,则会有很多的具体策略类,造成大量的类。

转载于:https://my.oschina.net/mengyuankan/blog/1606811

你可能感兴趣的文章
【VMware混合云】应用为王
查看>>
创建一个.Net项目
查看>>
SCVMM2012部署之四:安装VMM远程控制台
查看>>
大数据分析——信息安全下一站
查看>>
cocos2d-x学习笔记02:引擎特性
查看>>
如今的SEO与以往的SEO有何不同?
查看>>
ASP.NET 5系列教程 (一):领读新特性
查看>>
平台类网站为非星级酒店带来营销新机遇
查看>>
iphone5最新谍讯汇总
查看>>
Json概述以及python对json的相关操作
查看>>
用Saltstack的returners实现批量监控和数据存储
查看>>
四大特色引人注目瑞星ESM SOHO版全力护航小微企业
查看>>
闲聊明星形象对代言产品的影响
查看>>
与大数据打交道的那些人
查看>>
SQL JOIN--Nested Join
查看>>
linu下 php+nginx+mysql安装配置
查看>>
【轻松一刻】那些让我们惊叹不已的唯美GIF动态图片
查看>>
Html.ActionLink
查看>>
Qt事件处理(二)
查看>>
Baruwa 1.1.2 发布,邮件监控系统
查看>>