<wbr>JAVA适配模式<br><br></wbr>意图
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。(GoF)
场景
相信很多人都知道什么是显卡,也有很多人知道显卡的本名——图形适配器。恩,是的,正好这回说说Apater模式,就拿显卡来例子来分析一下Adapter模式。
我们知道显示器(Client)是用来显示图形的,它是不能显示数据,它只能够接受来自图形发送设备Target的信号。可是我们手头上只有CPU(Adaptee)这个产生各种描述图形的数据的数据发送器。我们需要将这些数据让显示器进行显示,可是这两个部件却是不兼容的。于是我们需要一个中间设备,它能够将CPU“适配”于显示器,这便是我们的显卡——图形适配器(Adapter)。
java 代码
// 图形发送设备
public class Target {
publicString request() {
return "Graphic sender";
}
}
//显示器
public classClient {
public static void main(String[] args) {
Target target = new Targete();
System.out.println(target.request());
}
}
可是我们的CPU(Adaptee)只能输出0/1数据,他是个计算器,而不是图形发送设备(Target)。
java 代码
//CPU
public classAdaptee {
public String getData() {
return "CPU data";
}
}
这个时候我们的显卡(Adapter)的作用便体现出来了,它负责对CPU进行适配,通过将CPU传过来的数据转换成图形信号,从而将CPU伪装成一个图形发送设备。
java 代码
<wbr><pre name="code" class="java"> //显卡,即我们的适配器
public classAdapter extends Target {
// 被代理的设备
private Adaptee apt = null;
public Adapter(Adaptee apt) {
this.apt = apt;
}
public String request() {
return apt.getData();
}
}
</pre>
<br><br><br>
这样,我们的电脑的显示流程就变成CPU-显卡-显示器:<br><br><div>java 代码<br><br><wbr><wbr><wbr><pre name="code" class="java"> public class Client {
public static void main(String[] args) {
// CPU经过显卡的适配后“变”成了图形发送装置了
Target target = new Adapter(new Adaptee());
System.out.println(target.request());
}
} </pre>
<br><br><br>
上面的这种依赖于对象组合的Adapter模式叫做<strong>对象适配器(ObjectAdapter)</strong>。它的特征是继承/实现某一方的类(Target),如这里的图形发送器,同时内部包含一个被适配的类(Adaptee),如这里的CPU。通过重写其父类的方法来进行适配。<br><br><br><span style="font-size:14px"><strong>另一种的Adapter实现</strong></span><br>
对于Adapter模式,还有另外一种实现方式,这种适配方式叫做<strong>类适配器(ClassAdapter)</strong>。它与Object Adapter的不同之处在于它继承被适配的对象。<br><br><div>java 代码<br><pre name="code" class="java"> public classAdapter extends Targer, Adaptee {
......
} </pre>
<br><br><br>
这样的代码在C++中是合法的,但是在Java中规定最多只能继承一个父类,而可以实现多个接口。所以我们需要建立一个IAdaptee的接口,然后将我们的Adapter继承Target同时实现IAdaptee。<br>
</div>
<br></wbr></wbr></wbr>
</div>
java 代码<br><wbr><br><br><wbr><pre name="code" class="java"> //IAdaptee接口
publicinterface IAdaptee{
String getData();
}
java 代码
// Adaptee实现IAdaptee
public classAdaptee implements IAdaptee {
......
}
java 代码
public classAdapter extends Target implements IAdaptee{
private IAdaptee apt = null;
public Adapter(IAdaptee apt) {
this.apt = apt;
}
public String request() {
return apt.getData();
}
public String getData() {
return apt.getData();
}
}
</pre>
<br><br><br>
对于我们的显示器(Client)方面,Class Adapter跟Object Adapter一样,所以不需要进行修改。<br><br>
对于ClassAdapter,大家也看见了,在Adapter中因为是实现了IAdaptee接口,因此需要实现getData()的接口。一旦Target和IAdaptee拥有相同的方法时,会出现麻烦的。所以尽量优先使用ObjectAdapter的模式。<br></wbr></wbr></wbr>
接口适配器
java中适配器的作用实际上是实现了接口的类,但是适配器所实现的只是空方法。因为如果我们不用适配器,直接去实现接口,也要逐个实现里面的方法,并且大多情况下我们也会像jdk里适配器所做的:仅仅以空方法去实现,只实现对我们有用的方法。
<wbr><br><br>
几乎所有申明了很多方法 的接口,都会有它自己的 适配器类。<wbr><br><br>
本身adapter没有什么作用,只是帮助程序员专注 所实现的功能,使代码简洁罢了<br><br>
举第一个例子:<br><p>为一个接口提供缺省实现,这样子类可以从这个缺省实现进行扩展.而不必从原有接口进行扩展.作为适配器模式的一个特例,缺省适配模式在java语言中有着特殊的应用.(引用java模式书)</p>
<p>adapter是一个非常常用的设计模式.<br>
像windows的每个窗口,事件很多个.关闭,移动,最大化,最小化,<br>
java代码设计如下:<br>
interface 窗口{<br>
public void 关闭();<br>
public void 移动();<br>
public ovid 最大化();<br>
...<br>
...<br>
}<br>
如果客户点击了关闭按钮,java类实现如下:<br>
Frame implements 窗口{<br>
public void 关闭(){<br>
System.out.println("关闭窗口");<br>
}</p>
<p>public void 移动()[<br>
}<br>
public ovid 最大化(){<br>
}<br>
...<br>
...<br>
}<br>
这里面我们可以看出,我们关注的只有关闭按钮触发的事件,其它的我们不用管.但是在java类中,我们必须把接口的所有方法都给实现.这样我们连一些没有用的方法也得给实现.那怕是空实现.</p>
<p><br>
下面我们来建一个抽象类来实现这个接口.<br>
public abstract Frame implements 窗口{<br>
public void 关闭(){</p>
<p>}</p>
<p>public void 移动(){<br>
}<br>
public ovid 最大化(){<br>
}<br>
...<br>
...<br>
}<br>
这里我们可以看出,抽象类给每个接口一个空的实现,那我们都可以在抽象类的基础上进行扩展。关闭功能实现如下:<br>
public CloseFrame extends Frame{<br>
public void 关闭(){<br>
System.out.println("关闭窗口");</p>
<p>}<br>
}</p>
<p>像在java中的事件处理都是用适配器模式来实现的。接口,抽象类都是已经写好的。我们只需要实现具体功能的类就可以了。</p>
<p>再举个简单的例子:<br>
假如存在如下接口:<br>
interface TestInterface{<br>
void test1();<br>
void test2();<br>
void test3();<br>
}<br>
如果我们只关注test1接口应该怎样写呢。<br>
abstract class TestAbstract implements Test{<br>
public void test1(){<br>
}<br>
public void test2(){<br>
}<br>
public void test3(){<br>
}<br>
}<br>
class TestTest1 extends TestAbstract{<br>
public void test1(){<br>
System.out.println("方法1实现");<br>
}<br>
}<br>
那么在什么情况下用相信大家已经能看得出来了吧。假如你不准备实现接口的所有方法。就可以建一个抽象类来实现这个接口的所有方法,当然这里全都是空的实现.然后再写一个类继承这个抽象类就可以得到你想要的结果了.</p>
<p><br></p>
<p>一个更简单的例子<br></p>
一般都是抽象类,API中很多都是这样的.比如在API中有<br>
java.awt.event.WindowListener接口这样定义的:(接口声明了很多对窗口的事件)<br>
public interface WindowListener{<br>
public void windowActivated(WindowEvent e) {<br>
}<br>
public void windowClosed(WindowEvent e) {<br>
}<br>
public void windowClosing(WindowEvent e) {<br>
}<br>
public void windowDeactivated(WindowEvent e) {<br>
}<br>
public void windowDeiconified(WindowEvent e) {<br>
}<br>
public void windowIconified(WindowEvent e) {<br>
}<br>
public void windowOpened(WindowEvent e) {<br>
}<br>
}<br>
但 是如果需要做一个关闭window的操作,如果直接实现这个接口的话,那么你必须对它声明的所以方法都实现,显然在逻辑中除了windowClosed(WindowEvente)方法外,对其他方法的实现都是做多余的操作.这样就出现了windowListener适配器类:<wbr><br><wbr> public abstract class WindowAdapter<br><wbr> implements WindowListener<br><wbr> {<br><wbr> public void windowClosing(WindowEvent e) {}<wbr><br><wbr> public void windowClosed(WindowEvent e) {}<br><wbr> public void windowIconified(WindowEvent e){}<br><wbr> public void windowDeiconified(WindowEvent e){}<br><wbr> public void windowActivated(WindowEvent e){}<br><wbr> public void windowDeactivated(WindowEvent e){}<br><wbr> }<br>
显然他是一个抽象类,之是对WindowListener的一个简单的实现而已,所以的方法都只做了空实现[没有方法体].而他的好处是:如果你只需要关闭窗口这一事件,则可以让处理类继承WindowAdapter这个抽象类,重写他的windowClosing(WindowEvente)方法就是了.<br>
WindowListener close = new WindowAdapter(<br>
public void windowClosing(WindowEvent e){<br>
System.exit(0);<br>
}<br>
);<br>
这样比实现接口就轻松多了啊,把它整成抽象类,是因为他的方法都是空实现,显然拿到他的实例也没有用的</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
分享到:
相关推荐
主要介绍了JAVA设计模式之适配器模式的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解
我想现在好多公司对设计模式都很重视,希望可以帮到大家,因为适配器设计模式在好多公司都用到了,有好东西自然要与大家同享了,希望各位事业发达,人生步步高升
主要介绍了Java适配器模式应用之电源适配器功能,较为详细的分析了适配器模式的概念、原理及Java基于适配器模式实现电源适配器功能的相关操作技巧与注意事项,需要的朋友可以参考下
Java语言Socket接口用法详解.doc Java语言Socket接口用法详解.doc Java语言Socket接口用法详解.doc Java语言Socket接口用法详解.doc Java语言Socket接口用法详解.doc Java语言Socket接口用法详解.doc Java语言Socket...
主要介绍了Java经典设计模式之适配器模式,简单说明了适配器模式的概念、原理,并结合实例形式分析了java适配器模式的用法与相关注意事项,需要的朋友可以参考下
详解JavaScript实现设计模式中的适配器模式的方法_.docx
内容包括统一建模语言基础知识、面向对象设计原则、设计模式概述、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式、适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、...
java设计模式详解,内容包括java开发中常用的开发模式,例如单例模式以及相应的实现方法等,我找了好久,所以分稍微多点
详解java接口、继承和多态
详解JAVA单例模式及多种实现
java23种设计模式详解附带所有代码实现,适合初学者,请点个赞,谢谢
主要介绍了java 设计模式之适配器模式的详解的相关资料,需要的朋友可以参考下
详解java接口interface
主要介绍了Java适配器模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
本资源是本人学习需要,通过网上查询,摘取网上有关设计模式好的解释,再由个人整理而得,绝对详解,看代码时最好结合word文档的图解一起,学习使用。
主要介绍了Java设计模式之监听器模式,结合实例形式较为详细的分析了java设计模式中监听器模式的概念、原理及相关实现与使用技巧,需要的朋友可以参考下
详细阐述java23中设计模式之经典应用,是很不错的东西,大家一起分享
设计模式代码详解(Java篇)设计模式代码详解(Java篇)
java正则表达式详解java正则表达式详解java正则表达式详解java正则表达式详解java正则表达式详解java正则表达式详解
java Bug模式详解