设计模式--缺省适配模式

我们知道,如果一个类要实现某一个接口,则必须实现该接口的全部方法

我们举例说明本科生读书的例子,本科生必须读完读四年修满所有的学分后,参加论文答辩后即可毕业.

我们定义一个本科生读书学习的接口Study。

Java代码   收藏代码
  1. interface Study  
  2. {  
  3.  public void StudyGrade1();  
  4.  public void StudyGrade2();  
  5.  public void StudyGrade3();  
  6.  public void StudyGrade4();  
  7.  public void ThesisPresentation();  
  8. }  

 

 

一个按照正常读书的大学生GeneralStudent,实现这个读书的接口 则如下

 

Java代码   收藏代码
  1. public class GeneralStudent implements Study  
  2. {  
  3.  public GeneralStudent(){}  
  4.   
  5.  public void StudyGrade1(){  
  6.     System.out.println("读大学一年级");   
  7.  }  
  8.   
  9.  public void StudyGrade2(){  
  10.     System.out.println("读大学二年级");   
  11.  }  
  12.   
  13.  public void StudyGrade3(){  
  14.     System.out.println("读大学三年级");   
  15.  }  
  16.   
  17.  public void StudyGrade4(){  
  18.     System.out.println("读大学四年级");    
  19.   
  20.  public void ThesisPresentation(){  
  21.   
  22.      System.out.println("修满了学分,参加论文答辩");   
  23.    
  24.  }  
  25. }  

 

 

但是这里有另外的一种情况,比如有一些学校采用的弹性学分制,只要修满所有的学分 可以提前安排答辩 早毕业。 
比如有个学生SpecialStudent,读到大三时候已经修完了所有学分,则其不用继续读大四,直接参加论文答辩,合格后就可以毕业。如果仍然让SpeicialStudent继承study接口,则显得不合实际。

 

如果硬要实现,也没其他办法,我们空实现即可,代码:

 

Java代码   收藏代码
  1. public class SpecialStudent implements Study  
  2. {  
  3.  public GeneralStudent(){}  
  4.   
  5.  public void StudyGrade1(){  
  6.     System.out.println("读大学一年级");   
  7.  }  
  8.   
  9.  public void StudyGrade2(){  
  10.     System.out.println("读大学二年级");   
  11.  }  
  12.   
  13.  public void StudyGrade3(){  
  14.     System.out.println("读大学三年级");   
  15.  }  
  16.   
  17.     //这个方法空实现  
  18.  public void StudyGrade4(){}   
  19.   
  20.  public void ThesisPresentation(){  
  21.   
  22.      System.out.println("修满了学分,参加论文答辩");   
  23.    
  24.  }  
  25. }  

 


在有些时候,如果我们不准备实现一个接口的全部方法时,因为我们这个类不需要用到接口中所规定的其他方法,我们按照如上的方式实现一些要用到的方法,没用的方法空实现。


很明显这是一种浪费,甚至是一种混乱。除非看过空方法的代码,否则不知道其不是空的,即使知道一些方法是空的,但不确定哪些方法是空的,哪些不是空的。这个时候我们可以考虑使用一个中间类来解决这个问题,这个中间类空实现接口的所有方法,同时,我们将这个中间类定义为抽象的,使其不可能被实例化,实例化中间过渡类没有任何实际的意义。 然后让具体的类继承这个中间类只让他覆盖自己所需的方法即可。


我们将这个中间过渡类称为 “缺省适配类”,这个模式也叫做缺省适配模式(Default Adapter)。

上个例子,我们增加一个缺省适配抽象类StudyAdapter

 

Java代码   收藏代码
  1. public abstract class StudyAdapter implements study  
  2. {  
  3.  public void StudyGrade1(){}  
  4.  public void StudyGrade2(){}  
  5.  public void StudyGrade3(){}  
  6.  public void StudyGrade4(){}  
  7.  public void ThesisPresentation(){};  
  8. }  

 

 

 

下面我们来看不同的具体类怎么使用这个缺省适配类.
普通的全日制大学生 GeneralStudent:

 

Java代码   收藏代码
  1. public class GeneralStudent extends StudyApater  
  2. {  
  3.  public GeneralStudent(){}  
  4.   
  5.  public void StudyGrade1(){  
  6.     System.out.println("读大学一年级");   
  7.  }  
  8.   
  9.  public void StudyGrade2(){  
  10.     System.out.println("读大学二年级");   
  11.  }  
  12.   
  13.  public void StudyGrade3(){  
  14.     System.out.println("读大学三年级");   
  15.  }  
  16.   
  17.  public void StudyGrade4(){  
  18.     System.out.println("读大学四年级");    
  19.   
  20.  public void ThesisPresentation(){  
  21.   
  22.      System.out.println("修满了学分,参加论文答辩");   
  23.    
  24.  }  
  25. }  

 

 

提前修满学分特殊的大学生SpecialStudent:

 

Java代码   收藏代码
  1. public class SpecialStudent extends StudyApater  
  2. {  
  3.  public SpecialStudent(){}  
  4.   
  5.  public void StudyGrade1(){  
  6.     System.out.println("读大学一年级");   
  7.  }  
  8.   
  9.  public void StudyGrade2(){  
  10.     System.out.println("读大学二年级");   
  11.  }  
  12.   
  13.  public void StudyGrade3(){  
  14.     System.out.println("读大学三年级");   
  15.  }  
  16.   
  17.  public void ThesisPresentation(){  
  18.   
  19.      System.out.println("修满了学分,参加论文答辩");   
  20.    
  21.  }  
  22. }  

 

 

读到大二就退学的大学生DiscontinueStudyStudent:

 

Java代码   收藏代码
  1. public class DiscontinueStudyStudent extends StudyAdapter  
  2. {  
  3.  public DiscontinueStudyStudent(){}  
  4.   
  5.  public void StudyGrade1(){  
  6.     System.out.println("读大学一年级");   
  7.  }  
  8.   
  9.  public void StudyGrade2(){  
  10.     System.out.println("读大学二年级");   
  11.  }  
  12.   
  13. }  

 

  如此一来,方便很多。程序逻辑更清晰明了了。

在java API中 就有很多类似的例子。比如java.awt.WindowAdapter  它就空实现了接口WindowListener的全部方法,它就是一个缺省适配类。


java.awt中很多的缺省适配类,可以自己看下。


本文转自http://jzinfo.iteye.com/blog/558373,所有权力归原作者所有。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值