| 1) 策略模式(Strategy Pattern)中,定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户 |
| 2) 这算法体现了几个设计原则,第一、把变化的代码从不变的代码中分离出来;第二、针对接口编程而不是具体类(定义了策略接口);第三、多用组合/聚合, |
| 少用继承(客户通过组合方式使用策略) |
-
原理类图

-
角色职责说明
| 客户context 有成员变量strategy或者其他的策略接口,至于需要使用到哪个策略,我们可以在构造器中指定 |
| 分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体设定行为对象。 |
| 原则就是:分离变化部分,封装接口,基于接口编程各种功能。此模式让行为的变化独立于算法的使用者 |

| package com.atguigu.strategy.improve; |
| public interface FlyBehavior { |
| void fly(); |
| } |
| |
| package com.atguigu.strategy.improve; |
| public class GoodFlyBehavior implements FlyBehavior { |
| @Override |
| public void fly() { |
| |
| System.out.println(" 飞翔技术高超 ~~~"); |
| } |
| } |
| |
| package com.atguigu.strategy.improve; |
| public class NoFlyBehavior implements FlyBehavior{ |
| @Override |
| public void fly() { |
| |
| System.out.println(" 不会飞翔 "); |
| } |
| } |
| |
| package com.atguigu.strategy.improve; |
| public class BadFlyBehavior implements FlyBehavior { |
| @Override |
| public void fly() { |
| |
| System.out.println(" 飞翔技术一般 "); |
| } |
| } |
| |
| package com.atguigu.strategy.improve; |
| public abstract class Duck { |
| |
| |
| FlyBehavior flyBehavior; |
| |
| QuackBehavior quackBehavior; |
| |
| public Duck() { |
| |
| } |
| |
| public abstract void display(); |
| |
| public void quack() { |
| System.out.println("鸭子嘎嘎叫~~"); |
| } |
| |
| public void swim() { |
| System.out.println("鸭子会游泳~~"); |
| } |
| |
| public void fly() { |
| |
| |
| if(flyBehavior != null) { |
| flyBehavior.fly(); |
| } |
| } |
| |
| public void setFlyBehavior(FlyBehavior flyBehavior) { |
| this.flyBehavior = flyBehavior; |
| } |
| |
| public void setQuackBehavior(QuackBehavior quackBehavior) { |
| this.quackBehavior = quackBehavior; |
| } |
| |
| } |
| |
| package com.atguigu.strategy.improve; |
| public class PekingDuck extends Duck { |
| |
| |
| public PekingDuck() { |
| |
| flyBehavior = new BadFlyBehavior(); |
| } |
| |
| @Override |
| public void display() { |
| |
| System.out.println("~~北京鸭~~~"); |
| } |
| |
| } |
| |
| package com.atguigu.strategy.improve; |
| public class ToyDuck extends Duck{ |
| |
| public ToyDuck() { |
| |
| flyBehavior = new NoFlyBehavior(); |
| } |
| |
| @Override |
| public void display() { |
| |
| System.out.println("玩具鸭"); |
| } |
| |
| |
| |
| public void quack() { |
| System.out.println("玩具鸭不能叫~~"); |
| } |
| |
| public void swim() { |
| System.out.println("玩具鸭不会游泳~~"); |
| } |
| |
| } |
| |
| package com.atguigu.strategy.improve; |
| public class WildDuck extends Duck { |
| |
| |
| public WildDuck() { |
| |
| flyBehavior = new GoodFlyBehavior(); |
| } |
| |
| @Override |
| public void display() { |
| |
| System.out.println(" 这是野鸭 "); |
| } |
| |
| } |
| |
| package com.atguigu.strategy.improve; |
| public class Client { |
| |
| public static void main(String[] args) { |
| |
| WildDuck wildDuck = new WildDuck(); |
| wildDuck.fly(); |
| |
| ToyDuck toyDuck = new ToyDuck(); |
| toyDuck.fly(); |
| |
| PekingDuck pekingDuck = new PekingDuck(); |
| pekingDuck.fly(); |
| |
| |
| pekingDuck.setFlyBehavior(new NoFlyBehavior()); |
| System.out.println("北京鸭的实际飞翔能力"); |
| pekingDuck.fly(); |
| } |
| |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?