| 1) 有各种鸭子(比如 野鸭、北京鸭、水鸭等, 鸭子有各种行为,比如 叫、飞行等) |
| 2) 显示鸭子的信息 |

-
问题类图

-
代码实现
| package com.atguigu.strategy; |
| public abstract class Duck { |
| |
| public Duck() { |
| } |
| |
| public abstract void display(); |
| |
| public void quack() { |
| System.out.println("鸭子嘎嘎叫~~"); |
| } |
| |
| public void swim() { |
| System.out.println("鸭子会游泳~~"); |
| } |
| |
| public void fly() { |
| System.out.println("鸭子会飞翔~~~"); |
| } |
| |
| } |
| |
| package com.atguigu.strategy; |
| public class WildDuck extends Duck { |
| |
| @Override |
| public void display() { |
| |
| System.out.println(" 这是野鸭 "); |
| } |
| |
| } |
| |
| package com.atguigu.strategy; |
| public class PekingDuck extends Duck { |
| |
| @Override |
| public void display() { |
| |
| System.out.println("~~北京鸭~~~"); |
| } |
| |
| |
| @Override |
| public void fly() { |
| |
| System.out.println("北京鸭不能飞翔"); |
| } |
| |
| } |
| |
| package com.atguigu.strategy; |
| public class ToyDuck extends Duck{ |
| |
| @Override |
| public void display() { |
| |
| System.out.println("玩具鸭"); |
| } |
| |
| |
| public void quack() { |
| System.out.println("玩具鸭不能叫~~"); |
| } |
| |
| public void swim() { |
| System.out.println("玩具鸭不会游泳~~"); |
| } |
| |
| public void fly() { |
| System.out.println("玩具鸭不会飞翔~~~"); |
| } |
| } |
| |
| package com.atguigu.strategy; |
| public class Client { |
| |
| public static void main(String[] args) { |
| |
| |
| } |
| |
| } |
| 1) 其它鸭子,都继承了Duck类,所以fly让所有子类都会飞了,这是不正确的 |
| 2) 上面说的1 的问题,其实是继承带来的问题:对类的局部改动,尤其超类的局部改动,会影响其他部分。会有溢出效应 |
| 3) 为了改进1问题,我们可以通过覆盖fly 方法来解决 => 覆盖解决 |
| 4) 问题又来了,如果我们有一个玩具鸭子ToyDuck, 这样就需要ToyDuck去覆盖Duck的所有实现的方法 => 解决思路 策略模式 (strategy pattern) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?