一、需求说明

  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 的所有实现的方法=》策略模式

 

posted on 2021-03-03 22:39  格物致知_Tony  阅读(69)  评论(0编辑  收藏  举报