`

三十三:缺省适配模式

阅读更多
缺省适配模式为一个接口提供缺省实现,这样子类型可以从这个缺省实现进行扩展,而不必从原有接口进行扩展

一:鲁智深的故事
和尚要做什么?念经,打坐,习武..如果设计一个和尚接口,给出所有的和尚都需要实现的方法:
interface和尚{ 
public void念经(); 
pulbic void打坐(); 
public void习武(); 
public String getName(); 
................... 
} 


如果这样的话,所有的和尚类都应当实现接口所定义的全部方法,如:
class鲁智深implements和尚{ 
public void习武(){ 
拳打镇关西; 
大闹五台山; 
........... 
} 
public String getName(){ 
return "鲁智深"; 
} 
} 


这样的话鲁智深当然连Java的编译器都通不过,鲁智深只有实现和尚里有的方法。这样一来,鲁智深便不再是鲁智深了。当初鲁达剃度,众僧说:"这个人形容丑陋,相貌凶顽,不可剃度他",但是长老却说:"此人上应天星,心地刚直,虽然时下凶顽,命中驳杂,久后却得清净。证果非凡,汝等皆不及他"。原来如此,大师高见,用我们OO的语言来说,"应"者,实现也,"天星"者,抽象类也,代码如下:
abstract class天星implements和尚{ 
public void念经(){} 
pulbic void打坐(){} 
public void习武(){} 
public String getName(){return null;} 
} 

class鲁智深extends天星{ 
public void习武(){ 
拳打镇关西; 
大闹五台山; 
........... 
} 
public String getName(){ 
return "鲁智深"; 
} 
} 


这样一来,鲁智深可以只实现它所需要的方法(在这里,我觉得确切地说,是没有直接实现不需要的方法,他还是继承有其他和尚的方法啊)
这个抽象的天星类便是一个适配器类,鲁智深实际上借助于适配器模式达到了剃度的目的。此适配器类实现了和尚接口所要求的所有方法,但是与通常适配器模式不同的是,此适配器类给出的所有的方法的实现都是"平庸"的。这种"平庸化"的适配模式称做缺省适配模式。

二:WindowAdapter是缺省适配器模式
我们知道WindowListener接口里定义了七个方法:
public interface WindowListener extends EventListener{ 
public void windowOpened(WindowEvent e); 
public void windowClosing(WindowEvent e); 
public void windowClosed(WindowEvent e); 
public void windowIconified(WindowEvent e); 
public void windowDeiconified(WindowEvent e); 
public void windowActivated(WindowEvent e); 
public void windowDeactivated(WindowEvent e); 
} 
如果下面我们的程序是这样写: 
class AppletFrame extends Frame implement WindowListener{ 
public void windowOpened(WindowEvent e){} 
public void windowClosing(WindowEvent e){} 
public void windowClosed(WindowEvent e){} 
public void windowIconified(WindowEvent e){} 
public void windowDeiconified(WindowEvent e){} 
public void windowActivated(WindowEvent e){} 
public void windowDeactivated(WindowEvent e){ 
this.setVisible(false); 
dispose(); 
System.exit(0); 
} 
} 

如果你写这个程序会不会觉得其余的六个方法我都不需要啊,可我还要来个空实现,我要的简洁美呢?所你你不用担心,sun还是贴心的,提供了一个WindowListener的适配器WindowAdapter,它的代码如下:
public abstract class WindowAdapter implements WindowListener{ 
public void windowOpened(WindowEvent e){} 
public void windowClosing(WindowEvent e){} 
public void windowClosed(WindowEvent e){} 
public void windowIconified(WindowEvent e){} 
public void windowDeiconified(WindowEvent e){} 
public void windowActivated(WindowEvent e){} 
public void windowDeactivated(WindowEvent e){} 
} 


这样我们的AppletFrame只要继承WindowAdapter并重写需要的方法就好了。 。
适配器模式的用意是要改变源的接口,以便与目标类的接口相容。缺省适配的用意稍有不同,它是为了方便建立一个不平庸的适配器类而提供一种平庸的实现。
任何时候如果不准备实现一个接口的所有方法时,就可以模仿WindowAdapter的做法制造一个抽象类,给出所有方法的平庸的具体实现,这样,从这个抽象类再继承下去的子类就不必实现所有的方法了.
J2SE中还有ComponentAdapter,FocusAdapter,KeyAdapter,MouseAdapter.......
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics