• 第一节:策略模式——需求说明&传统实现


    一、需求说明

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

     

  • 相关阅读:
    错误提示:Wrong Local header signature: 0xE011CFD0
    “CreateRiaClientFilesTask”任务意外失败。 未能加载文件程序集“System.ComponentModel.DataAnnot...
    jquery tagsinput监听输入、修改、删除事件
    bootstrap之常见组件应用1
    多啦A梦的制作
    Java 多线程
    Java集合的复习
    10种排序算法分析
    C++ 中vector的学习
    android学习流程确立
  • 原文地址:https://www.cnblogs.com/niujifei/p/14477439.html
Copyright © 2020-2023  润新知