策略模式
鸭子问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package com.strategy; //抽象类 鸭子 public abstract class Duck { public Duck() { } //默认实现 public void quack(){ System.out.println( "鸭子嘎嘎叫" ); } public void swim(){ System.out.println( "鸭子会游泳" ); } public void fly(){ System.out.println( "鸭子会飞翔" ); } //显示鸭子的信息 public abstract void display(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 | package com.strategy; public class PekingDuck extends Duck { @Override public void display() { System.out.println( "这是北京鸭" ); } @Override public void fly() { System.out.println( "北京鸭不能飞翔" ); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package com.strategy; public class ToyDuck extends Duck { @Override public void display() { System.out.println( "这是玩具鸭" ); } @Override public void quack() { System.out.println( "玩具鸭不能嘎嘎叫" ); } @Override public void swim() { System.out.println( "玩具鸭不会游泳" ); } @Override public void fly() { System.out.println( "玩具鸭不会飞翔" ); } } |
1 2 3 4 5 6 7 8 | package com.strategy; public class WildDuck extends Duck { @Override public void display() { System.out.println( "这是野鸭" ); } } |
1 2 3 4 5 6 7 8 9 10 11 12 | package com.strategy; public class Client { public static void main(String[] args) { Duck pekingDuck = new PekingDuck(); pekingDuck.display(); pekingDuck.fly(); pekingDuck.quack(); pekingDuck.swim(); } } |
执行结果:
北京鸭不能飞翔
鸭子嘎嘎叫
鸭子会游泳
这是北京鸭
说明:从上图可以看到,客户context,有成员变量strategy或者其他的策略接口,至于需要使用哪个策略,我们可以在构造器中进行指定。
这里补充一个小知识点哈:
组合:就好比是类中的属性
聚合:就好比是通过构造方法传入参数一样。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | package com.strategy.improve; //抽象类 鸭子 public abstract class Duck { //属性 策略接口 FlyBehavior flyBehavior; //protected FlyBehavior flyBehavior; //这种写法也是可以的 //其他属性 策略接口 QuackBehavior quackBehavior; public Duck() { } //默认实现 public void quack() { if ( null != quackBehavior){ quackBehavior.quack(); } } public void swim() { System.out.println( "鸭子会游泳" ); } public void fly() { if ( null != flyBehavior) { flyBehavior.fly(); } } //显示鸭子的信息 public abstract void display(); public void setFlyBehavior(FlyBehavior flyBehavior) { this .flyBehavior = flyBehavior; } public void setQuackBehavior(QuackBehavior quackBehavior) { this .quackBehavior = quackBehavior; } } |
1 2 3 4 5 | package com.strategy.improve; public interface FlyBehavior { public abstract void fly(); //子类要具体实现 } |
1 2 3 4 5 6 7 8 9 10 | package com.strategy.improve; public class BadFlyBehavior implements FlyBehavior { @Override public void fly() { System.out.println( "飞翔技术一般" ); } } |
1 2 3 4 5 6 7 8 | package com.strategy.improve; public class GoodFlyBehavior implements FlyBehavior { @Override public void fly() { System.out.println( "飞翔技术高超" ); } } |
1 2 3 4 5 6 7 8 | package com.strategy.improve; public class NoFlyBehavior implements FlyBehavior { @Override public void fly() { System.out.println( "不会飞翔" ); } } |
1 2 3 4 5 | package com.strategy.improve; public interface QuackBehavior { void quack(); } |
1 2 3 4 5 6 7 8 | package com.strategy.improve; public class GaGaQuackBehavior implements QuackBehavior { @Override public void quack() { System.out.println( "嘎嘎叫" ); } } |
1 2 3 4 5 6 7 8 | package com.strategy.improve; public class GeGeQuackBehavior implements QuackBehavior{ @Override public void quack() { System.out.println( "咯咯叫" ); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | package com.strategy.improve; public class PekingDuck extends Duck { @Override public void display() { System.out.println( "这是北京鸭" ); } //构造器 传入FlyBehavior public PekingDuck() { flyBehavior = new NoFlyBehavior(); quackBehavior = new GeGeQuackBehavior(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | package com.strategy.improve; public class ToyDuck extends Duck { @Override public void display() { System.out.println( "这是玩具鸭" ); } @Override public void swim() { System.out.println( "玩具鸭不会游泳" ); } //构造器 传入FlyBehavior public ToyDuck() { flyBehavior = new BadFlyBehavior(); quackBehavior = new GeGeQuackBehavior(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | package com.strategy.improve; public class WildDuck extends Duck { @Override public void swim() { super .swim(); } //构造器 传入FlyBehavior public WildDuck() { flyBehavior = new GoodFlyBehavior(); quackBehavior = new GaGaQuackBehavior(); } @Override public void display() { System.out.println( "这是野鸭" ); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package com.strategy.improve; public class Client { public static void main(String[] args) { WildDuck wildDuck = new WildDuck(); System.out.println( "野鸭的特征:" ); wildDuck.fly(); wildDuck.quack(); ToyDuck toyDuck = new ToyDuck(); System.out.println( "玩具鸭的特征" ); toyDuck.fly(); toyDuck.quack(); //动态改变某个对象的行为 玩具鸭子不会飞翔 toyDuck.setFlyBehavior( new NoFlyBehavior()); System.out.println( "玩具鸭的实际飞翔情况:" ); toyDuck.fly(); } } |
运行结果:
野鸭的特征:
飞翔技术高超
嘎嘎叫
玩具鸭的特征
飞翔技术一般
咯咯叫
玩具鸭的实际飞翔情况:
不会飞翔
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY