小侃设计模式(十三)-策略模式
创始人
2024-02-08 16:31:33
0

1.概述

策略模式(Strategy Pattern)是一种比较简单的模式,它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。策略模式具有较强的实用性,当一个对象拥有很多行为,且这些行为大部分很类似,需要大量的if…else来进行区分,使用策略模式能够有效降低耦合,降低代码复杂度。本文将分析策略模式的原理及使用方式。

2.原理及使用

2.1 原理

策略模式的类图如下:
在这里插入图片描述

策略模式主要包含三个角色:

Strategy(抽象策略角色):定义所有支持的算法的公共接口,通常是接口;
StrategyA、StrategyB(具体策略角色):实现抽象策略中的操作,该类含有具体的算法;
Context(封装角色):它封装了高层模块对策略、算法的直接访问,封装了可能存在的变化,起承上启下的作用。

2.2 案例

鸡分为野鸡、圈养的鸡,不同的鸡有不同的行为,比如飞翔和叫,野鸡和圈养的鸡各不相同,圈养的鸡不会飞翔。传统的方式是定义一个基类Chicken,野鸡和家鸡分别继承Chicken,实现自己的方法。这其实是有问题的,明明家鸡不会飞,却要继承飞的方法,拥有这个行为。
如果用策略模式实现上述案例,如下:
在这里插入图片描述
代码如下:

public class Chicken {public FlyBehavior flyBehavior;public Chicken(FlyBehavior flyBehavior) {this.flyBehavior = flyBehavior;}/*** 类型*/private String type;/*** 颜色*/private String color;/*** 图片*/private String image;/*** 年龄*/private Integer age;public void eat() {System.out.println("鸡都吃五谷杂粮");}public void method() {flyBehavior.fly();}
}public class Pheasant extends Chicken{public Pheasant(FlyBehavior flyBehavior) {super(flyBehavior);}public void method() {System.out.println("这是野鸡");flyBehavior.fly();}
}public class HomeChicken extends Chicken {public HomeChicken(FlyBehavior flyBehavior) {super(flyBehavior);}public void method() {System.out.println("这是家养的鸡");flyBehavior.fly();}}public interface FlyBehavior {void fly();
}public class FlyHigh implements FlyBehavior {@Overridepublic void fly() {System.out.println("飞的又高又远!");}
}public class CanNotFly implements FlyBehavior {@Overridepublic void fly() {System.out.println("可惜这只鸡不会飞");}}public class Test {public static void main(String[] args) {FlyHigh flyHigh = new FlyHigh();CanNotFly canNotFly = new CanNotFly();HomeChicken homeChicken = new HomeChicken(canNotFly);homeChicken.method();System.out.println("------------------------");Pheasant pheasant = new Pheasant(flyHigh);pheasant.method();}
}

测试结果如下:
在这里插入图片描述

2.3 策略模式的优缺点

2.3.1 优点

1.扩展性良好,新增算法时,只需新增一个策略类即可,其它无需修改;
2.算法切换灵活:不同的策略类在使用时传入到封装角色中,可以灵活切换;
3.避免使用多重条件判断:使用策略模式能够有效减少代码中的if…else判断语句,增强程序可读性。

2.3.2 缺点

1.容易造成类爆炸:当策略过多时,策略类会有很多,不易复用;
2.所有的策略类都要对外暴露,违反迪米特法则。

3.小结

1.策略模式的关键是:分析项目中变化部分与不变部分,它的核心思想是:多用组合/聚合少用继承;用行为类组合,而不是行为的继承;
2.体现了“对修改关闭,对扩展开放”原则,客户端增加行为不用修改原有代码,只要添加一种策略(或者行为)即可,避免了使用多重转移语句(if…else if…else);
3.提供了可以替换继承关系的办法:策略模式将算法封装在独立的Strategy类中使得你可以独立于其Context改变它,使它易于切换、易于理解、易于扩展;
4.需要注意的是:每添加一个策略就要增加一个类,当策略过多是会导致类数目庞大。

4.参考文献

1.《设计模式之禅》-秦小波著
2.《大话设计模式》-程杰著
3.https://www.bilibili.com/video/BV1G4411c7N4-尚硅谷设计模式

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...