Strategy 设计模式第2讲——策略模式

目录
一、什么是策略模式
二、角色组成
三、优缺点
【Strategy设计模式第2讲——策略模式】四、应用场景
4.1 生活场景
4.2 java场景
五、代码实现
5.0、UML类图
5.1、——环境类()
5.2、——抽象策略类()
5.3、具体策略类( )
5.4、
一、什么是策略模式
策略模式属于行为型设计模式 。定义了一系列算法,并将这些算法封装到一个类中,使得他们可以相互替换 。这样,我们可以在改变某个对象使用的算法的情况下,选择一个合适的算法来处理特定的任务,主要解决多重if-else的判断逻辑 。
二、角色组成三、优缺点
优点:
缺点:
四、应用场景 4.1 生活场景4.2 java场景五、代码实现
下面以视频平台为例,解释一下策略模式 。
5.0、UML类图

Strategy  设计模式第2讲——策略模式

文章插图
5.1、——环境类()
/*** @author Created by njy on 2023/5/25* 1.策略环境类(Context)* 在初始化VideoContext对象时,将所有策略实现类塞进Map中,* key为视频类型(dy、ks、wx) value为对应的视频实现类* 通过getVideoStrategy方法,根据videoType从map中渠道对应的视频策略* 从而隐藏了策略的具体实现逻辑 。这种方式可以遵循开闭原则,因为在新增视频类型时,只需要增加对应的实现类*/@Componentpublic class VideoContext {private static final Map videoMap = new HashMap<>();/*** 对象初始化时,将所有策略实现类加入到map中* @param videoStrategies*/public VideoContext(List videoStrategies) {videoStrategies.forEach(strategy -> videoMap.put(strategy.getVideoType(), strategy));}/*** 根据videoType获取对应的策略实现类* @param videoType* @return*/public VideoStrategy getVideoStrategy(String videoType){VideoStrategy videoStrategy = videoMap.get(videoType);if (videoStrategy==null) {throw new RuntimeException("videoType inValid!");}return videoStrategy;}}
5.2、——抽象策略类()
/*** @author Created by njy on 2023/5/25* 2.抽象策略类(Strategy)*/public interface VideoStrategy {//刷视频String brushVideo();//视频类型String getVideoType();}
5.3、具体策略类( )
/*** @author Created by njy on 2023/5/25*3.具体策略类(Concrete Strategy):微信*/@Componentpublic class WxVideoStrategy implements VideoStrategy{@Overridepublic String brushVideo() {return "我在刷微信视频号";}@Overridepublic String getVideoType() {return "wx";}}
/*** @author Created by njy on 2023/5/25*3.具体策略类(Concrete Strategy):快手*/@Componentpublic class KsVideoStrategy implements VideoStrategy{@Overridepublic String brushVideo() {return "我在刷快手";}@Overridepublic String getVideoType() {return "ks";}}
/*** @author Created by njy on 2023/5/25* 3.具体策略类(Concrete Strategy):抖音*/@Componentpublic class DyVideoStrategy implements VideoStrategy{@Overridepublic String brushVideo() {return "我在刷抖音";}@Overridepublic String getVideoType() {return "dy";}}
5.4、
/*** @author njy* @date 2023/5/24 13:58* 策略模式测试类*/@SpringBootTestpublic class TestStrategy {@Autowiredprivate VideoContext videoContext;@Testvoid testStrategy(){//策略模式VideoStrategy video1 = videoContext.getVideoStrategy("dy");String v1 = video1.brushVideo();System.out.println("v1 : " + v1);VideoStrategy video2 = videoContext.getVideoStrategy("ks");String v2 = video2.brushVideo();System.out.println("v2 : " + v2);VideoStrategy video3 = videoContext.getVideoStrategy("wx");String v3 = video3.brushVideo();System.out.println("v3 : " + v3);}}