设计模式之策略模式学习笔记
发布日期:2021-05-06 23:31:39 浏览次数:32 分类:精选文章

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

前言

我想大家都加班写过“业务代码”,一大堆的if else,甚至if里面套if…代码不得已变得十分臃肿,对应的维护成本也有所增加。而策略模式,就是为了解决违反了开放封闭原则的这一问题。

定义

定义一系列算法,把每个算法都封装起来,并使之可以相互替换。策略模式可以使算法可以独立于用户,来独立的变化

结构图

在这里插入图片描述角色拆解分析:

1.Context:上下文角色,用来操作策略的上下文环境,承上启下,屏蔽高层模块对算法、策略的直接访问
2.Stragety:抽象策略角色,策略、算法的抽象,通常为接口
3.ConcreteStragety:具体的策略实现

举栗实现

这里就用哈士奇大G举栗吧,毕竟二哈是一个神奇的物种,狗怂话多,上帝向人间洒下了智慧,唯独二哈却撑起了伞。还有狂风桑配音的那两只吵架的柯基(劳资把你周围的空气吃光,把你给憋死!),一场嘴遁大战即将开战!没有人一上来就放大的,否则会被喷死的。要想取胜,就得制定应敌策略。

1.Stragety策略接口

策略接口定义了一个放技能的方法

public interface FightStratety {       public void fighting();//放技能的方法}

2.ConcreteStragety具体的策略实现

这里制定了2个级别的策略,分别是普通策略和终极策略,用来对付不同水准的对手。

/** * 普通策略,大G先用爪子试探下对手水平 */public class CommenStratety implements FightStratety {       @Override    public void fighting() {           System.out.print("对手太水没必要放大招,一边走位一边A就好");    }}
/** * 终极策略,柯基要把大G周围的空气吃光,想把大G憋死 */public class FinalStratety implements FightStratety {       @Override    public void fighting() {           System.out.print("对手太强了,直接放大吧");    }}

3.Context上下文角色

构造方法包含了策略类,根据传进来的具体策略释放不同的技能

public class Context {       private FightStratety mFightStratety;    public Context(FightStratety fightStratety) {           mFightStratety = fightStratety;    }    /**     * 根据传进来的策略,释放不同的技能     * */    public void fighting(){           mFightStratety.fighting();    }}

4.客户端调用

大G与柯基互相探明对方实力,然后采用了不同的策略来释放技能。

public class Client {       public static void main(String []args){           Context context;        //大G先用爪子试探了一下柯基,柯基愤怒回应:喵~        context = new Context(new CommenStratety());        context.fighting();        //大G龇牙咧嘴,柯基觉得唬不住了,决定要把大G周围的空气吃光,把大G憋死        context = new Context(new FinalStratety());        context.fighting();    }}

一场嘴遁大战后,哈士奇大G落荒而逃,自此深知狗生无望…

优缺点对比

优点

1.避免使用多重条件语句,因为不易维护,好出错
2.方便拓展,添加一个策略,只要实现接口即可
缺点
1.每个策略都是一个类,复用性太小。
2.上层模块必须知道有哪些策略,才能够使用,违反了迪米特原则

使用场景

1.对用户隐藏具体的实现策略、算法,完全独立

2.针对同一类型问题的多种处理方式,仅仅是具体行为有差别时
3.在一个类中定义了很多行为,且以多重条件语句出现

上一篇:设计模式之模板模式学习笔记
下一篇:设计模式之享元模式学习笔记

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月01日 08时43分15秒