当前位置: 首页 > 后端技术 > Java

策略模式

时间:2023-04-01 16:13:55 Java

策略是对算法的封装,将不同的算法封装到具有相同接口的独立类中,使算法本身和客户端分离,算法之间可以相互替换。在策略模式中,主要有以下几类角色上下文信息类(Context):用于存储和执行具体需要使用的策略类和客户端调用的逻辑。抽象策略类(Strategy):定义策略的常用方法。具体策略类(ConcreteStrategy等):实现抽象策略类定义的常用方法。下面使用策略模式来模拟我开发过程中的一个场景。在聚合支付中,商家往往会绑定一些专门用于支付广播的盒子。我们称之为云广播。这些云广播可能是由不同的制造商制作的。我们在做通知的时候,因为厂商提供的接口和调用方式也不同,我们把云广播通知抽象成一个抽象的策略,每个具体的厂商就是一个具体的策略。抽象策略publicinterfaceCloudHornStrategy{/***发送消息*@parambody*@return*/booleansendMessage(CloudRequestBodybody);}parameterclasspublicclassCloudRequestBody{privatestaticMapchannelMap=newHashMap<>();static{channelMap.put(1,"支付宝");channelMap.put(2,"微信");channelMap.put(3,"云闪付");channelMap.put(4,"数字人民币");}/***金额*/privateLongmoney;/***通道*/私有字符串通道;publicCloudRequestBody(Longmoney,intchannel){this.money=money;this.channel=channelMap.get(channel);}publicLonggetMoney(){还钱;}publicStringgetChannel(){返回通道;}}具体策略publicclassLDCloudHornStrategyimplementsCloudHornStrategy{@OverridepublicbooleansendMessage(CloudRequestBodybody){//.....//一些列组装参数,数据处理,调用厂商接口Stringmsg=String.format("LD厂商推送:%s到达%d元",body.getChannel(),body.getMoney());System.out.println(味精);返回真;}}@OverridepublicbooleansendMessage(CloudRequestBodybody){//.....//一些组装参数,数据处理,调用厂商接口Stringmsg=String.format("TY厂商推送:%s到达%d元",body.getChannel(),body.getMoney());System.out.println(味精);返回真;}}通知上下文publicclassPayNotifyContext{privatestaticMapstrategyMap=null;static{strategyMap=newHashMap<>();strategyMap.put("LD",newLDCloudHornStrategy());strategyMap.put("TY",newTYCloudHornStrategy());私有CloudHornStrategy策略;publicPayNotifyContext(Stringhorn){这个。strategy=strategyMap.get(喇叭);}publicvoidpayNotify(CloudRequestBodybody){strategy.sendMessage(body);}}付费客户客户端通知publicclassPayClient{publicstaticvoidmain(String[]args){//支付成功,回调通知接口//获取用户绑定的几个云广播的类型//比如用户有三个云广播……当然,获取到的用户数据不能只有用户使用的云直播品牌。我们暂时忽略其他用户信息。String[]horns=newString[]{"TY","LD","LD"};//假设错误已支付CloudRequestBodybody=newCloudRequestBody(5L,1);for(Stringhorn:horns){newPayNotifyContext(horn).payNotify(body);}}}=====Result=====TY商家推送:支付宝到5元LD商家推送:支付宝到5元LD商家推送:支付宝到5元当我们使用新的云播时manufacturer,我们只需要添加一个策略,然后在对应集合中添加枚举值就可以了,所以对代码的改动最小,符合开闭原则,大大解耦