Java实验案例(接口)

实验任务

  • 任务一:设计实现发声接口
  • 任务二:动物乐园

实验内容

任务一:设计实现发声接口

任务目的:

  1. 理解并掌握如何定义接口
  2. 掌握接口的实现方式

任务描述:

  设计和实现一个Soundable接口,该接口具有发声功能,同时还能调节声音大小

Soundable接口的这些功能将由有3种声音设备来实现他们分别是Radio、Walkman、

Mobilephone。最后还需设计一个应用程序类来使用这些实现Soundable接口的声音

设备。程序运行时,先询问用户想听那个设备,然后程序按照该设备的工作方式来输

出发音。

实施步骤:

1. 定义 Soundable接口

public interface Soundable {

    // 发出声音
    public void playSound() ;
    
    // 降低声音
    public void decreaseVolume();
    
    // 停止声音
    public void stopSound();
}

2. 设计Radio类

public class Radio implements Soundable{

    @Override
    public void playSound() {
        System.out.println("收音机播放广播:中央人民广播电视台。");
    }

    @Override
    public void decreaseVolume() {
        System.out.println("降低收音机音量。");
    }

    @Override
    public void stopSound() {
        System.out.println("关闭收音机。");
    }
}

 3. 设计Walkman类

 

public class Walkman implements Soundable{

    @Override
    public void playSound() {
        System.out.println("随身听发出音乐");
    }

    @Override
    public void decreaseVolume() {
        System.out.println("降低随身听音量");
    }

    @Override
    public void stopSound() {
        System.out.println("关闭随身听");
    }

}

4. 设计MobilePhone类

public class MobilePhone implements Soundable{

    @Override
    public void playSound() {
        System.out.println("手机发出来电铃声:叮当 、 叮当");
    }

    @Override
    public void decreaseVolume() {
        System.out.println("降低手机音量");
    }

    @Override
    public void stopSound() {
        System.out.println("关闭手机");
    }
    
}

5. 设计SampleDisplay类

class SampleDisplay {
    public void display(Soundable soundable) {
        soundable.playSound();
        soundable.decreaseVolume();
        soundable.stopSound();
    }
}

6. 测试类

import java.util.Scanner;

public class TestDemo {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("你想听什么?请输入:");
        System.out.println("0-收音机  1-随身听  2-手机");
        int choice;
        choice = in.nextInt();
        SampleDisplay sampledisplay = new SampleDisplay();
        if (choice == 0)
            sampledisplay.display(new Radio());
        else if(choice == 1)
            sampledisplay.display(new Walkman());
        else if(choice == 2)
            sampledisplay.display(new MobilePhone());
        else
            System.out.println("瓜娃,你输错了!");
        in.close();
    }

}

 

 

 

任务二:动物乐园

任务目的

  能够灵活运用接口解决多继承问题

任务描述

  编写程序模拟动物园里饲养员给各种动物喂养各种不同食物的过程。当饲养员

给动物喂食时,动物发出欢快的叫声。

实施步骤

  在这个动物园里,涉及的对象有饲养员,各种不同动物以及各种不同的食物。这样

很容易抽象出3个类Feeder、Animal和Food。假设只考虑猫科和狗类动物,则由Animal

类派生出Cat类、Dog类、同样由Food类可以进一步派生出其子类Bone、Fish。因为他

们之间存在这明显的is-a关系。

  同样鱼是一种食物,但实际上,鱼也是一种动物,Cat类和Dog类继承了Animal的很多

属性和方法,如果将Animal定义为接口,Animal中是不能定义成员变量和成员方法的,Food

类中虽然也有变量但是数量比Animal少,所以我们考虑将Food定义为接口,此时可以说“鱼

是一种动物,同时也是一种食物”。

代码实现:

定义Animal类

 

public abstract class Animal {

    private String name;
    
    public Animal(String name) {
        this.name = name;
    }
    
    public abstract void shout();
    public abstract void eat(Food food);

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
}

 

Animal的子类Cat类

public class Cat extends Animal{

    public Cat(String name) {
        super(name);
    }

    public void shout() {
        System.out.println("喵呜.....");
    }

    public void eat(Food food) {
        System.out.println(getName() + "正在吃着香喷喷的" + food.getName());
    }
    
}

Animal的子类Dog类

public class Dog extends Animal {

    public Dog(String name) {
        super(name);
    }
    
    @Override
    public void shout() {
        System.out.println("汪汪汪.....");
    }

    @Override
    public void eat(Food food) {
        System.out.println(getName() + "正在啃着香喷喷的" + food.getName());
    }

}

定义Food类

public interface Food {
    public abstract String getName();
}

Fish类

public class Fish extends Animal implements Food{

    public Fish(String name) {
        super(name);
    }

    @Override
    public void shout() {
        
    }

    @Override
    public void eat(Food food) {
        
    }

}

Bone类

public class Bone implements Food{

    @Override
    public String getName() {
        return "bone";
    }

}

Feeder类

public class Feeder {

    private String name;
    public Feeder(String name) {
        this.name = name;
    }
    
    public void speak() {
        System.out.println("欢迎来到动物园!");
        System.out.println("我是饲养员 "+getName());
    }
    
    public void feed(Animal a, Food food) {
        a.eat(food);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
}

测试类:

public class TestDemo {

    public static void main(String[] args) {
        Feeder feeder = new Feeder("花花");
        feeder.speak();
        
        Dog dog = new Dog("小布丁");
        Food food = new Bone();
        feeder.feed(dog, food);
        
        Cat cat = new Cat("小猫崽");
        food = new Fish("黄花鱼");
        feeder.feed(cat, food);
    }

}

 

posted @ 2017-09-14 15:46  gaoyanliang  阅读(5666)  评论(0编辑  收藏  举报