一、需求说明
1、有各种鸭子(比如 野鸭、北京鸭、水鸭等,鸭子有各种行为,比如 叫、飞行等)
2、显示鸭子的信息
二、传统方案解决鸭子问题的分析和代码实现
1、传统的设计方案(类图)
2、代码
抽象鸭子类:
1 public abstract class Duck {
2 public Duck() {
3
4 }
5
6 public abstract void display();//显示鸭子信息
7
8 public void quack() {
9 System.out.println("鸭子嘎嘎叫~~");
10 }
11
12 public void swim() {
13 System.out.println("鸭子会游泳~~");
14 }
15
16 public void fly() {
17 System.out.println("鸭子会飞翔~~~");
18 }
19 }
各种鸭子实现类:
1 public class WildDuck extends Duck{
2 @Override
3 public void display() {
4 System.out.println(" 这是野鸭 ");
5 }
6 }
7
8 ------------------------------------------------
9 public class PekingDuck extends Duck{
10 @Override
11 public void display() {
12 System.out.println("~~北京鸭~~~");
13 }
14
15 /**
16 * 因为北京鸭不能飞翔,因此需要重写fly
17 */
18 @Override
19 public void fly() {
20 System.out.println("北京鸭飞翔一般");
21 }
22 }
23 ------------------------------------------------
24 public class ToyDuck extends Duck{
25 @Override
26 public void display() {
27 System.out.println("玩具鸭");
28 }
29
30 //需要重写父类的所有方法
31
32 @Override
33 public void quack() {
34 System.out.println("玩具鸭不能叫~~");
35 }
36
37 @Override
38 public void swim() {
39 System.out.println("玩具鸭不会游泳~~");
40 }
41
42 @Override
43 public void fly() {
44 System.out.println("玩具鸭不会飞翔~~~");
45 }
46 }
客户端:
1 public class Client {
2 public static void main(String[] args) {
3 WildDuck wildDuck = new WildDuck();
4 wildDuck.fly();
5
6 PekingDuck pekingDuck = new PekingDuck();
7 pekingDuck.fly();
8
9 ToyDuck toyDuck = new ToyDuck();
10 toyDuck.fly();
11 }
12 }
3、传统的方式实现的问题分析和解决方案
(1)其他鸭子,都继承了 Duck 类,所以 fly 让所有子类都会飞了,这是不正确的;
(2)上面说的 1 的问题,其实是继承带来的问题;对类的局部改动,尤其超类的局部改动,会影响其他部分。会有益处效应。
(3)为了改进1的问题,可以通过覆盖 fly 方法来解决 =》覆盖解决;
(4)问题又来了,如果我们有一个玩具鸭子 ToyDuck,这样就需要 ToyDuck 去覆盖 Duck 的所有实现的方法=》策略模式