1.策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
2.抽象鸭子类,鸭子飞行行为在此处类似于算法族
1 package com.pattern.strategy; 2 /** 3 * 抽象鸭子 4 * @author Administrator 5 * 6 */ 7 public abstract class Duck { 8 9 FlyBehavior fb;//行为接口声明两个引用变量,所有鸭子子类都继承他 10 Quack q; //鸭子鸣叫行为接口 11 12 13 //加入两个set方法,用来改变鸭子的行为 14 public void setFb(FlyBehavior fb) { 15 this.fb = fb; 16 } 17 18 public void setQ(Quack q) { 19 this.q = q; 20 } 21 22 public Duck() { 23 // TODO Auto-generated constructor stub 24 } 25 26 public abstract void display();//展示鸭子的样子,不同的鸭子样子不一样 27 28 //鸭子的飞行委托给行为类 29 public void performFly(){ 30 fb.fly(); 31 } 32 33 public void performQuack(){ 34 q.quack(); 35 } 36 //所有的鸭子都会游泳 37 public void swim(){ 38 System.out.println("all ducks float,even decoys!"); 39 } 40 41 }
3.鸭子飞行行为接口
1 package com.pattern.strategy; 2 /** 3 * 所有飞行行为类必须实现此接口 4 * @author Administrator 5 * 6 */ 7 public interface FlyBehavior { 8 9 public void fly(); 10 11 12 13 } 14 /** 15 * 飞行行为的实现者,给真会飞的鸭子用 16 * @author Administrator 17 * 18 */ 19 class FlyWithWings implements FlyBehavior{ 20 21 @Override 22 public void fly() { 23 System.out.println("I AM FLYING!"); 24 25 } 26 27 } 28 /** 29 * 飞行行为的实现者,给不会飞的鸭子用 30 * @author Administrator 31 * 32 */ 33 class FlyNoWay implements FlyBehavior{ 34 35 @Override 36 public void fly() { 37 System.out.println("I CANT'T FLY!"); 38 39 } 40 41 } 42 /** 43 * 增加一个火箭动力飞行行为 44 * @author Administrator 45 * 46 */ 47 class RocketFly implements FlyBehavior{ 48 49 @Override 50 public void fly() { 51 System.out.println("一飞冲天"); 52 53 } 54 55 }
4.鸭子鸣叫行为接口
package com.pattern.strategy; /** * 所有鸣叫行为类必须实现此接口 * @author Administrator * */ public interface Quack { public void quack(); } //呱呱叫的行为实现 class QQuack implements Quack{ @Override public void quack() { System.out.println("quack quack!"); } } //吱吱叫的行为实现 class Squack implements Quack{ @Override public void quack() { System.out.println("ZHI ZHI"); } } /** * 不会叫的行为实现 * @author Administrator * */ class Silence implements Quack{ @Override public void quack() { System.out.println("silence"); } }
5.鸭子的实现类绿头鸭,会飞也会叫
package com.pattern.strategy; /** * 鸭子的实现类,绿头鸭 * @author Administrator * */ public class MallDuck extends Duck { public MallDuck() { super(); fb = new FlyWithWings();//绿头鸭带翅膀会飞 q = new QQuack();//绿头鸭是呱呱叫 // TODO Auto-generated constructor stub } @Override public void display() { System.out.println("i am a MallDuck"); } }
6.鸭子实现类模型鸭子,不会飞,也不会叫
package com.pattern.strategy; /** * 模型鸭子 * @author Administrator * */ public class ModelDuck extends Duck { public ModelDuck() { super(); fb = new FlyNoWay(); q = new Silence(); // TODO Auto-generated constructor stub } @Override public void display() { System.out.println("我 是 模型 鸭子"); } }
7.客户端测试代码
package com.pattern.strategy; /** * 测试类,把行为看做一个算法族,算法代表鸭子能做的事,客户使用封装好的飞行和呱呱叫算法族 * 这种做法就是组合,鸭子的行为不是继承来的,而是适当的行为对象组合来的,如FlyBehavior和Quack * 使用组合将算法组封装成类,可以运行时动态的改变行为 * @author Administrator * */ public class Simulator { public static void main(String[] args) { Duck d = new MallDuck(); d.performFly(); d.performQuack(); Duck model = new ModelDuck(); model.performFly();//模型鸭子不会飞 //我突然想让他飞 model.setFb(new RocketFly());//运行时改变鸭子的行为,只需要调用set方法即可 model.performFly(); } }
8.测试结果
9.
常见开发中场景:
---JAVASE中GUI编程,布局管理
---Spring框架中,Resource接口,资源访问策略
---javax.servlet.http.HttpServlet#service();
需要程序源码的可以加我微信x241602私聊。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?