学妹面试拼刀刀被问Java策略模式是什么鬼?

哈哈哈哈 学妹跟我讲怎么机智面对的 我呆了!

小编这有自学的过程中有一些资源可以免费共享,

【内涵Java学习80g视频,大厂面试题库,Java学习书籍,或者技术指导】

加微信领取【备注007

 

1.策略模式到底是什么鬼捏???

  • 策略模式属于对象的行为模式。

其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

简单的说,策略模式代表了一类算法的通用解决方案,你可以在运行时选择使用哪种解决方案。

  •  策略模式的重心

策略模式的重心不是如何实现算法, 而是如何组织、调用这些算法, 从而使得程序结构更加灵活,具有更好的维护性和扩展性。

  • 算法的平等性

策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,地位都是一样的,因此可以实现算法之间可以互相替换。所有的策略算法在实现上也是相互独立的,相互之间是没有依赖的。所以可以这样描述这一系列策略算法:策略算法是相同行为的不同实现。

  • 运行时策略的唯一性 

运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只能使用一个。

  • 公有的行为

经常见到的是,所有的具体策略都有一些公有的行为。这时候,就应该把这些公有的行为放到共同的抽象策略角色

Strategy类里面。这时不能使用接口,应该使用抽象类来实现。

2.策略模式的结构

    

策略模式包含三部分内容:(如下图所示)

  1. 一个或多个使用策略对象的客户.(环境角色)
  2. 一个代表某个算法的接口, 它是策略模式的接口. (抽象策略角色)

c.一个或多个该接口的具体实现, 它们代表了算法的多种实现.(具体策略角色)

3.策略模式的应用  

 a.容错恢复机制, 程序运行的时候, 如果发生某种错误, 系统并不会直接挂掉或者说影响系统的其他功能点. 而是系统可以容忍这样的错误, 并且事先提供好了这种容错恢复机制, 来使得程序正常的运行下去.

 例如: 一个系统要对所有的操作进行日志记录, 且需要把日志记录落库, 方便后续的使用, 但是在把日志记录落库的时候, 可能会发生错误, 如数据库出现问题, 那就先可以记录在文件里面, 等到数据库问题修复, 再把文件中的日志记录同步到数据库中去.【参考文献】

对于这样的功能设计, 可以采用策略设计模式, 根据需要在运行期间进行动态的切换.

 b.假设现在要设计一个会员机制的购物系统, 对本系统的所有SVIP提供打八折的购物优惠, 对本系统的所有VIP提供打九折的购物优惠, 对非会员购物不打折. 那么对于这样的系统功能设计, 也可以采用策略模式来设计.

  c.使用不同的条件(物品的重量或者颜色等)来筛选库存中的物品, 可以将这一模式应用到更广泛的领域, 比如使用不同的标准来验证输入的有效性, 使用不同的方式来分析或者格式化输入.

 4.策略模式Demo

假设现在需要根据业务的需求,对调用接口传进来的参数,选择合适的策略进行处理,这里假设有策略一和策略二。

策略一:

/**

 * @author lyh

 * @version v-1.0.0

 * @since 2021/6/2

 */

public class Client {

    public static void main(String[] args) {

        //根据需要客户自行选择策略

        //加入Java开发交流君样:756584822一起吹水聊天

        //选择策略1

        StrategyObj strategyOne = new StrategyObj(new StrategyOne());

        System.out.println(strategyOne.strategy("one"));

        //选择策略2

        StrategyObj strategyTwo = new StrategyObj(new StrategyTwo());

        System.out.println(strategyTwo.strategy("two"));

    }

}

输出:

执行策略1!

执行策略2!

Process finished with exit code 0

策略二:

/**

 * @desc:策略接口

 */

public interface Strategy {

    String execute(String s);

}

/**

 * @desc:策略接口封装

 */

public class StrategyObj {

    private final Strategy strategy;

    public StrategyObj(Strategy v) {

        this.strategy = v;

    }

    public String strategy(String s) {

        return strategy.execute(s);

    }//

}

 Lambda表达式避免了采用策略设计模板时僵化的模板代码。仔细看上面的代码会发现,Lambda表达式实际已经对策略进行了封装, 这就是创建策略设计模式的初衷.

5.策略模式的优缺点

优点 

  1. 使用策略模式可以避免使用多重条件if…else if…else语句, 多重条件不易维护且代码可读性差.

 b.策略模式提供了管理相关的算法族的办法. 策略类的等级结构定义了一个算法或者行为族. 恰当使用继承可以把公共的代码移到父类里面, 从而避免代码重复.【参考文献】  

缺点

  1. 客户端必须知道所有的策略类, 并自行决定使用哪一个策略类. 这就意味着客户端必须理解这些算法的区别, 以便适时选择恰当的算法类. 换言之, 策略模式只适用于客户端知道算法或行为的情况.
  2.  b.由于策略模式把每个具体的策略实现都单独封装成类, 如果备选的策略很多的话, 那么对象的数目就会很多.  

最后,祝大家早日学有所成,拿到满意offer,快速升职加薪,走上人生巅峰。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值