初读《Head First 设计模式》第一章 设计模式入门

1 篇文章 0 订阅
1 篇文章 0 订阅

情景带入:

              公司需要你设计一个模拟鸭子的游戏

              1、所以你创建了一个父类Duck.java类,并写了公共方法,会游泳,还会呱呱叫,因为所有鸭子都会。

public class Duck {
    public void swim(){
        System.out.println("duck swim.........");//鸭子游泳
    }
    public void quack(){
        System.out.println("duck gua gua gua.........");//鸭子呱呱叫
    }
    public void display(){
        swim();//展示这只鸭子的技能
        quack();//展示鸭子呱呱叫
    }
}

2、你还创建了2种不同种类的鸭子,子类 RedheadDuck(红头鸭)、RubberDuck(机器鸭),他们都继承了Duck父类

//红头鸭子
public class RedheadDuck extends Duck{
    @Override
    public void swim() {
        System.out.println("RedheadDuck swim..............");
    }

    @Override
    public void quack() {
        System.out.println("RedheadDuck quack..............");
    }
}

 

//机器鸭子
public class RubberDuck extends Duck{
    @Override
    public void swim() {
        System.out.println("RubberDuck swim......................");
    }

    @Override
    public void quack() {
        System.out.println("RubberDuck quack......................");
    }
}
//演示2只鸭子的功能
public class DemoDuck {

    public static void main(String[] args) {
        RedheadDuck redheadDuck = new RedheadDuck();
        redheadDuck.display();

        System.out.println();

        Duck rubberDuck = new RubberDuck();
        rubberDuck.display();
    }
}

这是2只鸭子所具有的功能:

接着,公司说需要让鸭子飞。很简单嘛,直接在父类加个fly方法不就好了

//父类加了fly方法
public class Duck {
    public void swim(){
        System.out.println("duck swim.........");//鸭子游泳
    }
    public void quack(){
        System.out.println("duck gua gua gua.........");//鸭子呱呱叫
    }
    public void fly(){
        System.out.println("duck fly.........");//鸭子飞起来了
    }
    public void display(){
        fly();//让鸭子飞起来
        swim();//展示这只鸭子的技能
        quack();//展示鸭子呱呱叫
    }
}
//红头鸭子类重写fly方法
public class RedheadDuck extends Duck{
    @Override
    public void swim() {
        System.out.println("RedheadDuck swim..............");
    }

    @Override
    public void quack() {
        System.out.println("RedheadDuck quack..............");
    }

    @Override
    public void fly() {
        System.out.println("RedheadDuck fly..............");
    }
}
//我没有重写fly,因为机器鸭是不会飞的
public class RubberDuck extends Duck{
    @Override
    public void swim() {
        System.out.println("RubberDuck swim......................");
    }

    @Override
    public void quack() {
        System.out.println("RubberDuck quack......................");
    }
}

起因:机器鸭不能飞,所以我没有重写他的fly方法,但我继承了他的父类。然后就发生了奇怪的事情。

导致结果:公司演示鸭子游戏的时候,满天的机器鸭子也在飞。

原因是:我没有在机器鸭的类里重写fly方法。于是我重写了该方法。

引出的问题:但我想到一个问题, 以后我每创建一个鸭子 子类,我就需要根据鸭子是否可以飞,来决定是否重写他的fly方法,好麻烦。。。。

解决方法: 我们遵循设计原则---找出子类中肯能需要变化的地方,把它们独立起来,不要和那些不需要变化的代码混在一起。

创建一个 Flyable 的接口,创建鸭子 子类的时候,如果该鸭子是需要飞的,就实现该接口

//可飞行接口
public interface Flyable {
    void fly();
}
//实现Flyable
public class RedheadDuck extends Duck implements Flyable {
    @Override
    public void swim() {
        System.out.println("RedheadDuck swim..............");
    }

    @Override
    public void quack() {
        System.out.println("RedheadDuck quack..............");
    }

    @Override
    public void fly() {
        System.out.println("RedheadDuck fly..............");
    }

    @Override
    public void display() {
        fly();
        super.display();
    }
}
//不实现Flyable
public class RubberDuck extends Duck{
    @Override
    public void swim() {
        System.out.println("RubberDuck swim......................");
    }

    @Override
    public void quack() {
        System.out.println("RubberDuck quack......................");
    }
}
//删除fly方法,只放鸭子共有的
public class Duck {
    public void swim(){
        System.out.println("duck swim.........");//鸭子游泳
    }
    public void quack(){
        System.out.println("duck gua gua gua.........");//鸭子呱呱叫
    }
    public void display(){
        swim();//展示这只鸭子的技能
        quack();//展示鸭子呱呱叫
    }
}

大家可以,自己创建一个例子试试

 

这是我的公众号,对大家有帮助,昔日贤文

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值