在一个收银系统中,如果普通用户、中级会员、高级会员对应不同的优惠政策,常规的编程必须使用一系列的判断语句来判断用户类型。在这种情况下,您可以使用策略模式。1.概念理解策略模式的概念很容易理解。它将对象与行为分离,将行为定义为行为接口和具体行为的实现,每一个if判断都可以理解为一种策略。如果策略模式用在收银系统中,普通会员、中级会员、高级会员分别定义一个具体的策略类,并实现各自的方法,定义一个环境类,持有策略类的引用,并调用相应的通过引用策略类方法,客户端传入对应的具体策略对象,调用各自的策略方法。很多人在学习了statemode之后,也把statemode和statemode搞混了。现在你可以想想为什么不使用状态模式呢?每个策略之间没有转移(例如:状态1234切换)关系,每个算法实现自己的逻辑,客户端控制调用哪个策略。如果用state模式,就变成了,先调用普通会员的策略,再调用中级会员的策略,再调用高级会员的策略,看到最后的优惠用户估计要疯了!和状态模式一样,策略模式也应该包括三个角色:抽象策略类:策略是一个接口,定义了几个算法标识,也就是定义了几个抽象方法具体策略类:具体策略是实现了策略接口的类Environment类/上下文类:上下文提供了一种方法,该方法持有对策略类的引用,并最终由客户端调用。与状态模式相比,策略模式中各个角色的职责更加简单。我们基于收银机案例实现策略模式demo。2.案例实现抽象策略类:定义业务抽象方法,我们主要计算价格/***策略抽象类*@authortcy*@Date21-09-2022*/publicinterfaceAbstractMemberStrategy{//一个计算价格的抽象方法//priceproductpricennumberofproductspublicdoublecalcPrice(doubleprice,intn);}具体策略-高级会员:每个具体策略实现自己的计算方法/**高级会员*@authortcy*@Date21-09-2022*/publicclassStrategyAdvanceMemberimplementsAbstractMemberStrategy{@OverridepublicdoublecalcPrice(doubleprice,intn){doublemoney=price*n*0.8;退钱;}}具体策略-中间成员:/***中间成员*@authortcy*@Date21-09-2022*/publicclassStrategyIntermediateMemberimplementsAbstractMemberStrategy{@OverridepublicdoublecalcPrice(doubleprice,intn){doublemoney=价格*n*0.9;退钱;}}specificStrategy-OrdinaryMember:/***PrimaryMember*@authortcy*@Date21-09-2022*/publicclassStrategyPrimaryMemberimplementsAbstractMemberStrategy{@OverridepublicdoublecalcPrice(doubleprice,intn){返回价格*名词;}}环境类:持有政策策略类的引用,调用时传入对应的具体策略对象,会调用策略的各个方法/**环境类*@authortcy*@Date21-09-2022*/publicclassContext{//用户折扣策略接口privateAbstractMemberStrategymemberStrategy;//注入构造函数publicContext(AbstractMemberStrategymemberStrategy){this.memberStrategy=memberStrategy;}//计算价格publicdoubleqoutePrice(doublegoodsPrice,intn){//通过接口变量调用对应的具体策略returnmemberStrategy.calcPrice(goodsPrice,n);}}客户端调用:/***@authortcy*@Date21-09-2022*/publicclassClient{publicstaticvoidmain(String[]args){//工具策略类AbstractMemberStrategyprimaryMemberStrategy=newStrategyPrimaryMember();AbstractMemberStrategyintermediateMemberStrategy=newStrategyIntermediateMember();AbstractMemberStrategyadvanceMemberStrategy=newStrategyAdvanceMember();//用户选择不同的策略ContextprimaryContext=newContext(primaryMemberStrategy);上下文intermediateContext=newContext(intermediateMemberStrategy);语境advanceContext=newContext(advanceMemberStrategy);//100元一本书//普通会员:100System.out.println("普通会员价格:"+primaryContext.qoutePrice(100,1));//中级会员90System.out.println("中级会员价格:"+intermediateContext.qoutePrice(100,1));//高级会员80System.out.println("高级会员价格:"+advanceContext.qoutePrice(100,1));}}策略模式比状态模式更容易理解3、应用策略模式在Jdk中的典型应用是Jdk中线程池满后的拒绝策略。我们在创建线程池时,会传入如下参数:publicThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,BlockingQueue
