java语法——使用事件适配器
2011-09-01 09:20
225 查看
适配器模式
解决的问题:接口中规定了所有要实现的方法 ;但一个要继承此接口的具体类,只用到了其中的几个方法,而其它的方法都是没有用的。
共有两类适配器模式:
Adapter模式的宗旨:保留现有类所提供的服务,向客户提供接口,以满足客户的期望。
当客户在接口中定义了他期望的行为时,我们就可以应用适配器模式,提供一个实现该接口的类,并且扩展已有的类,通过创建子类来实现适配。
下面是类适配器的UML图:
(2)对象适配器:
对象适配器”通过组合除了满足“用户期待接口”还降低了代码间的不良耦合。在工作中推荐使用“对象适配”。下面是对象适配器的UML图:
(3) 缺省适配器模式:
缺省适配器模式是一种特殊的适配器模式,但这个适配器是由一个抽象类实现的,并且在抽象类中要实现目标接口中所规定的所有方法,但很多方法的实现都是“平庸”的实现,也就是说,这些方法都是空方法。而具体的子类都要继承此抽象类。
1.接口中规定了所有要实现的方法
2.但一个要继承此接口的具体类,只用到了其中的几个方法,而其它的方法都是没有用的。
2.原本要继承接口的子类,只继承1中的抽象类即可,并在其内部实现时,只对其感兴趣的方法进行实现。
2.为什么要用抽象类:
此类是不要被实例化的。而只充当适配器的角色,也就为其子类提供了一个共同的接口,但其子类又可以将精力只集中在其感兴趣的地方。
eg:
class WindowExit implements WindowListener{
@Override
public void windowActivated(WindowEvent e) {}
@Override
public void windowClosed(WindowEvent e) {}
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
@Override
public void windowDeactivated(WindowEvent e) {}
@Override
public void windowDeiconified(WindowEvent e) {}
@Override
public void windowIconified(WindowEvent e) {}
@Override
public void windowOpened(WindowEvent e) {}
}
使用适配器模式:
class WindowExit1 extends WindowAdapter{
public void WindowClosing(WindowEvent e){
System.exit(0);
}
}
使用匿名内部类更加简单
f.addWindowListener(new WindowAdapter(){
public void WindowClosing(WindowEvent e){
System.exit(0);
}
});
解决的问题:接口中规定了所有要实现的方法 ;但一个要继承此接口的具体类,只用到了其中的几个方法,而其它的方法都是没有用的。
共有两类适配器模式:
对象适配器模式
-- 在这种适配器模式中,适配器容纳一个它我包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。类适配器模式
-- 这种适配器模式下,适配器继承自已实现的类(一般多重继承)。关于JAVA适配器的解释
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。——Gang of Four基本概念
客户:需要调用我们的代码的对象。Adapter模式的宗旨:保留现有类所提供的服务,向客户提供接口,以满足客户的期望。
主要内容
(1)类适配器:当客户在接口中定义了他期望的行为时,我们就可以应用适配器模式,提供一个实现该接口的类,并且扩展已有的类,通过创建子类来实现适配。
下面是类适配器的UML图:
(2)对象适配器:
对象适配器”通过组合除了满足“用户期待接口”还降低了代码间的不良耦合。在工作中推荐使用“对象适配”。下面是对象适配器的UML图:
(3) 缺省适配器模式:
缺省适配器模式是一种特殊的适配器模式,但这个适配器是由一个抽象类实现的,并且在抽象类中要实现目标接口中所规定的所有方法,但很多方法的实现都是“平庸”的实现,也就是说,这些方法都是空方法。而具体的子类都要继承此抽象类。
适用情况
使用的前提:1.接口中规定了所有要实现的方法
2.但一个要继承此接口的具体类,只用到了其中的几个方法,而其它的方法都是没有用的。
实现方法
1.用一个抽象类继承已有的接口,并实现接口中所规定的所有方法,这些方法的实现可以都是“平庸”实现----空方法;但此类中的方法是具体的方法,而不是抽象方法,否则的话,在具体的子类中仍要实现所有的方法,这就失去了适配器本来的作用。2.原本要继承接口的子类,只继承1中的抽象类即可,并在其内部实现时,只对其感兴趣的方法进行实现。
注意事项
1.充当适配器角色的类就是:继承已有接口的抽象类2.为什么要用抽象类:
此类是不要被实例化的。而只充当适配器的角色,也就为其子类提供了一个共同的接口,但其子类又可以将精力只集中在其感兴趣的地方。
适配器模式解析
你想使用一个已经存在的适配器模式,而他的接口不符合你的需求。你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作。你想使用一些已经已经存在的子类,但是不可能对每一个都进行子类化已一匹配他们的接口,对象适配器可以适配他的父类接口。 适配器如同一个常见的变压器,也如同电脑的变压器和插线板之间的电源连接线,他们虽然都是3相的,但是电脑后面的插孔却不能直接插到插线板上。 作者曾经遇到过一个ASP编程的难题,asp不是面向对象的,但是却可以借鉴适配器模式解决问题。问题是这样的,在一个产品表(product)中的所有产品都有一个编号,字段名字是bh,每个编号是唯一的,但却不是主键,表中使用一个自动增长的id作为主键。在产品的详情页中使用传过来的参数id查询产品,而在另外的一个系统中也有一个同样的表,需要访问详情页(已经由另外的一个程序员设计好,并且代码晦涩难懂),由于字段值是自动增长的,两个表中的主键并不对应(在其中的一个系统中进行删除添加都会引起id的增长),在具体的实现中,本人在有详情页的系统中添加了一个页面(adapter),接受传过来的产品编号bh,然后根据编号查找数据库得到相应产品的驻键id,最后让页面跳转到详情页并传递一个id,在另外的系统中只要得到产品的编号bh,并把bh作为参数传递到添加的页面(adapter)便可以得到正确的结果。eg:
class WindowExit implements WindowListener{
@Override
public void windowActivated(WindowEvent e) {}
@Override
public void windowClosed(WindowEvent e) {}
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
@Override
public void windowDeactivated(WindowEvent e) {}
@Override
public void windowDeiconified(WindowEvent e) {}
@Override
public void windowIconified(WindowEvent e) {}
@Override
public void windowOpened(WindowEvent e) {}
}
使用适配器模式:
class WindowExit1 extends WindowAdapter{
public void WindowClosing(WindowEvent e){
System.exit(0);
}
}
使用匿名内部类更加简单
f.addWindowListener(new WindowAdapter(){
public void WindowClosing(WindowEvent e){
System.exit(0);
}
});
相关文章推荐
- Java基础之处理事件——使用适配器类(Sketcher 3 using an Adapter class)
- Java_语法基础_优先使用整型池
- Java之正则表达式【使用语法】
- Java,Jsp点击事件后,出现等沙漏,处理等待状态时,有提示在动,适合任何事件使用
- Java与Flex区别一:使用自定义事件
- java正则表达式语法详解及其使用代码实例
- 11级_Java_曹建波5.04 事件适配器
- java正则表达式语法详解及其使用代码实例
- AndroidStudio 中开启Java8语法和Retrolambda库的使用
- Java高级语法笔记-异常中finally的使用
- JAVA中点击按钮事件弹出子窗口:JInternalFrame的使用
- java正则表达式语法详解及其使用代码实例
- java默认语法、EL、JSTL表达式,JSTL和struts Tag标签的使用总结
- Java JList的使用和事件响应
- 使用handleEvent()方法,action()方法和mouseDown()方法处理事件的JAVA Application程序.
- Java学习笔记——MySQL的安装使用以及SQL语法简介
- 学习使用J2EE Web应用的事件功能-Java基础-Java-编程开发
- 正确使用Java事件通知
- 第五天03 JAVA基础语法(认识对象--使用标准类)(学习笔记)
- java笔记--使用事件分配线程更新Swing控件