zoukankan      html  css  js  c++  java
  • 面向接口编程的小例子

    以前学习Java的时候,就听过面向接口编程,可惜当时水平太低不理解(当然,现在水平还是很低),现在学习了一点。接下来,我们通过一个小例子学习面向接口编程。
     
    背景:假设每个单身狗都喜欢和蚊子玩,蚊子有一个唱歌的方法。代码如下:
    1. //Mosquito.java
    2. //蚊子类,拥有一个唱歌的方法
    3. package project.app.service;
    4. publicclassMosquito{
    5. publicString sing(){
    6. return"You have to admit that I sing songs very well.";
    7. }
    8. }
    9.  
    1.  
    2. //Single.java
    3. //单身狗类,playWithMosquito依赖于蚊子类
    4. package project.app.service;
    5. import project.app.service.Mosquito;
    6. publicclassSingle{
    7. privateMosquito mosquito;
    8. publicvoid setMosquito(Mosquito mosquito){
    9. this.mosquito = mosquito;
    10. }
    11. publicvoid playWithMosquito(){
    12. System.out.println(mosquito.sing());
    13. }
    14. }
    接下来,可以测试一下
    1. //Test.java
    2. package chris;
    3. import project.app.service.*;
    4. publicclassTest{
    5. publicstaticvoid main(String[] args)throwsException{
    6. Single single =newSingle();
    7. Mosquito mosquito =newMosquito();
    8. //设置single实例和mosquito实例的关系
    9. single.setMosquito(mosquito);
    10. single.playWithMosquito();
    11. }
    12. }
    结果:
    You have to admit that I sing songs very well.
     
    如果之后单身狗和蚊子友谊的小船翻了,改成和蟑螂玩了,应该怎么改代码呢?一般的做法大概是这样。
    增加蟑螂类。
    1. //Cockroach.java
    2. //蟑螂类,有不同于蚊子的唱歌的方法
    3. package project.app.service;
    4. publicclassCockroach{
    5. publicString sing(){
    6. return"I sing when everybody is in sleep.";
    7. }
    8. }
    在单身狗类中,将有关蚊子的改成有关蟑螂的。
    1. //Single.java
    2. //单身狗类,playWithMosquito依赖于蟑螂类
    3. package project.app.service;
    4. import project.app.service.Cockroach;
    5. publicclassSingle{
    6. privateCockroach cockroach;
    7. publicvoid setCockroach(Cockroach cockroach){
    8. this.cockroach = cockroach;
    9. }
    10. publicvoid playWithCockroach(){
    11. System.out.println(cockroach.sing());
    12. }
    13. }
    可以测试一下。
    1. //Test.java
    2. package chris;
    3. import project.app.service.*;
    4. publicclassTest{
    5. publicstaticvoid main(String[] args)throwsException{
    6. Single single =newSingle();
    7. Cockroach cockroach =newCockroach();
    8. single.setCockroach(cockroach);
    9. single.playWithCockroach();
    10. }
    11. }
    运行结果: I sing when everybody is in sleep.
     
    经过上面的实践,我们发现,单身狗类依赖于蚊子类,导致蚊子类变化成蟑螂类时,单身狗类的代码必须跟着改变,这样类之间的耦合性太强了。我们想想,蚊子和蟑螂虽然唱着不同的歌,但是唱歌的方法却是相同的。为了代码能够降低耦合,我们可以使用接口,利用面向对象的多态性。可以将蚊子和蟑螂抽象一下,在概念上,往上升一级,比如宠物,动物,生物,物质。动物、生物和物质这几个接口就太宽了,也把单身狗包括进去了,那么,我们选择到宠物这一层。我们通过例子看一下。
    1. //Pet.java
    2. //宠物接口,有一个唱歌的方法
    3. package project.app.service;
    4. publicinterfacePet{
    5. publicString sing();
    6. }
    蚊子类实现宠物接口
    1. //Mosquito.java
    2. //
    3. package project.app.service.impl;
    4. import project.app.service.Pet;
    5. publicclassMosquitoimplementsPet{
    6. publicString sing(){
    7. return"You have to admit that I sing songs very well.";
    8. }
    9. }
    1. //Single.java
    2. //单身狗类,playWithMosquito依赖于Pet接口,注意,这个时候单身狗类只依赖于宠物接口,不依赖于具体的蚊子类了。
    3. package project.app.service;
    4. import project.app.service.Pet;
    5. publicclassSingle{
    6. privatePet pet;
    7. publicvoid setPet(Pet pet){
    8. this.pet = pet;
    9. }
    10. publicvoid playWithPet(){
    11. System.out.println(pet.sing());
    12. }
    13. }
    1. //Test.java
    2. package chris;
    3. import project.app.service.Single;
    4. import project.app.service.Pet;
    5. import project.app.service.impl.Mosquito;
    6. publicclassTest{
    7. publicstaticvoid main(String[] args)throwsException{
    8. Single single =newSingle();
    9. Mosquito mosquito =newMosquito();
    10. single.setPet(mosquito);
    11. single.playWithPet();
    12. }
    13. }
    如果我们改成和蟑螂玩,则修改代码时,增加蟑螂类的代码(也要实现宠物接口),单身狗类不用变(耦合性大大降低啊,节省了好多重复劳动)。
    1. //Cockroach.java
    2. //蟑螂类,有唱歌的方法
    3. package project.app.service.impl;
    4. import project.app.service.Pet;
    5. publicclassCockroachimplementsPet{
    6. publicString sing(){
    7. return"I sing when everybody is in sleep.";
    8. }
    9. }
     
    测试代码经过轻微的修改:
    1.  
    2. //Test.java
    3. package chris;
    4. import project.app.service.Single;
    5. import project.app.service.Pet;
    6. import project.app.service.impl.Cockroach;
    7. publicclassTest{
    8. publicstaticvoid main(String[] args)throwsException{
    9. Single single =newSingle();
    10. Cockroach cockroach =newCockroach();
    11. single.setPet(cockroach);
    12. single.playWithPet();
    13. }
    14. }
     
    上面的例子可以算是面向接口编程的一个例子。通过使用接口,利用面向对象的多态性,将蚊子类抽象成宠物接口,使单身狗类只依赖于抽象的宠物接口,大大降低了单身狗类对具体的蚊子类的依赖。这样,大大地方便了后期的扩展和维护,比如增加会唱歌的蟋蟀类等。
     
     
     





  • 相关阅读:
    localStorage单页面及不同页面监听变动
    localstorage跨域解决方案
    eclipse下安装插件
    (转)springAOP解析-2
    (转)springAOP解析-1
    spring源码深度解析-2功能扩展
    spring源码深度解析-1核心实现
    (转)ConcurrentHashMap解析
    (转)HashMap分析
    java程序员应该掌握的技能
  • 原文地址:https://www.cnblogs.com/bottleondesk/p/5540148.html
Copyright © 2011-2022 走看看