深入了解Java行为型设计模式之策略模式_第1页
深入了解Java行为型设计模式之策略模式_第2页
深入了解Java行为型设计模式之策略模式_第3页
深入了解Java行为型设计模式之策略模式_第4页
深入了解Java行为型设计模式之策略模式_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第深入了解Java行为型设计模式之策略模式目录策略模式应用场景优缺点主要角色策略模式的基本使用创建抽象策略角色创建具体策略角色创建上下文角色客户端执行策略模式实现支付方式的选择创建抽象策略角色创建具体策略角色创建上下文角色客户端执行

策略模式

策略模式(StrategyPattern)也叫政策模式(PolicyPattern),属于行为型模式。

它是将定义的一系列算法、分别封装起来,让它们之间可以互相替换,从而让算法的变化不会影响到使用算法的用户。

策略模式能让你定义一系列算法,并将每种算法分别放入独立的类中,以使算法的对象能够相互替换。

应用场景

1、针对同一类型问题,有多种处理方式,每一种都能独立解决问题。

2、算法需要自由切换的场景。

3、需要屏蔽算法规则的场景。

优缺点

优点:

1.可以在运行时切换对象内的算法。

2.避免使用多重条件转移语句,如if.else.语句、switch语句

3.使用策略模式可以提高算法的保密性和安全性。

4.可以将算法的实现和使用算法的代码隔离开来。

缺点:

1.客户端必须知道所有的策略,所有策略类都需要对外暴露,并且自行决定使用哪一个策略类。

2.代码中会产生非常多策略类,增加维护难度。

主要角色

1.抽象策略角色(Strategy)

规定策略或算法的行为。

2.具体策略角色(ConcreteStrategy)

具体的策略或算法实现。

3.上下文角色(Context)

用来操作策略的上下文环境,屏蔽高层模块(客户瑞)对策略,算法的直接访问,封装可能存在的变化。

策略模式的基本使用

创建抽象策略角色

publicinterfaceIStrategy{

*算法、策略

voidalgorithm();

创建具体策略角色

publicclassConcreteStrategyAimplementsIStrategy{

publicvoidalgorithm(){

System.out.println("StrategyA打9折");

publicclassConcreteStrategyBimplementsIStrategy{

publicvoidalgorithm(){

System.out.println("StrategyB打8折");

创建上下文角色

publicclassContext{

privateIStrategymStrategy;

publicContext(IStrategystrategy){

this.mStrategy=strategy;

publicvoidalgorithm(){

this.mStrategy.algorithm();

}

客户端执行

publicstaticvoidmain(String[]args){

//创建具体策略

IStrategystrategyA=newConcreteStrategyA();

IStrategystrategyB=newConcreteStrategyB();

//创建上下文环境

ContextcontextA=newContext(strategyA);

ContextcontextB=newContext(strategyB);

//客户端直接让上下文环境执行算法

contextA.algorithm();

contextB.algorithm();

StrategyA打9折

StrategyB打8折

策略模式实现支付方式的选择

创建抽象策略角色

创建支付抽象类,定义支付逻辑

publicabstractclassPayment{

*支付类型

publicabstractStringgetName();

*支付

*@paramuid用户id

*@paramamount金额

*@return支付结果

publicStringpay(Stringuid,doubleamount){

if(queryBalance(uid)amount){

return"支付失败,"+"商品金额:"+amount+",用户余额:"+queryBalance(uid);

return"支付成功,"+"商品金额:"+amount+",用户余额:"+(queryBalance(uid)-amount);

*余额查询

*@paramuid用户id

*@return余额

protectedabstractdoublequeryBalance(Stringuid);

}

创建具体策略角色

创建具体支付方式,如AliPay、WechatPay、UnionPay等三种方式。

publicclassAliPayextendsPayment{

publicStringgetName(){

return"支付宝";

protecteddoublequeryBalance(Stringuid){

return500;

publicclassWechatPayextendsPayment{

publicStringgetName(){

return"微信支付";

protecteddoublequeryBalance(Stringuid){

return600;

publicclassUnionPayextendsPayment{

publicStringgetName(){

return"银联支付";

protecteddoublequeryBalance(Stringuid){

return800;

}

创建上下文角色

创建上下文角色,

publicclassPayStrategy{

publicstaticfinalStringALI_PAY="AliPay";

publicstaticfinalStringWECHAT_PAY="WechatPay";

publicstaticfinalStringUNION_PAY="UnionPay";

publicstaticfinalStringDEFAULT_PAY=ALI_PAY;

privatestaticMapString,Paymentstrategy=newHashMapString,Payment

static{

strategy.put(ALI_PAY,newAliPay());

strategy.put(WECHAT_PAY,newWechatPay());

strategy.put(UNION_PAY,newUnionPay());

publicstaticPaymentget(StringpayKey){

if(!strategy.containsKey(payKey)){

returnstrategy.get(DEFAULT_PAY);

returnstrategy.get(payKey);

}

客户端执行

publicclassOrder{

privateStringuid;

privateStringname;

privatedoubleprice;

publicOrder(Stringuid,Stringname,doubleprice){

this.uid=uid;

=name;

this.price=price;

publicStringpay(){

returnpay(PayStrategy.DEFAULT_PAY);

publicStringpay(StringpayKey){

Paymentpayment=PayStrategy.get(payKey);

System.out.println("购买:"+name+",使用"+payment.getName()+"支付,"+"支付金额为:"+price);

returnpayment.pay(uid,price);

}

publicstaticvoidmain(String[]args){

Orderorder=newOrder("001","皮皮虾",500.5);

System.out.println(order.pay());

System.out.println("----------------------------------------------------");

System.out.println(order.pay(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论