标签:类的方法 测试 wrap java target over info end bst
小六新买了一个小米6手机,它高高兴兴的拿到新手机,想要插上耳机听歌,但发现手机没有耳机孔,仔细查看说明书之后发现,小米6手机是充电孔耳机孔在一起,在插耳机时需要一个耳机转接器,才能插耳机。我们用程序员的眼观来看,这里相当于增加了一个转接器类用于适配耳机,这就类似于我们今天提到的设计模式—适配器模式。
适配器模式的类图如下所示:
其中:
适配器模式的主要功能是进行转换匹配,用来复用已有的功能。适配器模式将某个类的接口转换成客户端期望的另一个接口,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类适配器模式、对象适配器模式、接口适配器模式。
三种适配器模式有各自的应用场景:
下面针对三种情况进行代码实现:
核心思想就是:有一个Source类,拥有一个方法,待适配,目标接口是Targetable,通过Adapter类,将Source的功能扩展到Targetable里,类图如下所示:
代码如下:
public class Source {
public void method1() {
System.out.println("this is original method!");
}
}
public interface Targetable {
/* 与原类中的方法相同 */
public void method1();
/* 新类的方法 */
public void method2();
}
Adapter类继承Source类,实现Targetable接口:
public class Adapter extends Source implements Targetable {
@Override
public void method2() {
System.out.println("this is the targetable method!");
}
}
这样Targetable接口的实现类就具有了Source类的功能。下面为测试类:
public class AdapterTest {
public static void main(String[] args) {
Targetable target = new Adapter();
target.method1();
target.method2();
}
}
基本思路和类的适配器模式相同,只是将Adapter类作修改,这次不继承Source类,而是持有Source类的实例,以达到解决兼容性的问题。如图:
只需要修改Adapter类的源码即可:
public class Wrapper implements Targetable {
private Source source;
public Wrapper(Source source){
super();
this.source = source;
}
@Override
public void method2() {
System.out.println("this is the targetable method!");
}
@Override
public void method1() {
source.method1();
}
}
测试类:
public class AdapterTest {
public static void main(String[] args) {
Source source = new Source();
Targetable target = new Wrapper(source);
target.method1();
target.method2();
}
}
输出与第一种一样,只是适配的方法不同而已。
接口的适配器模式是当一个接口中有多个抽象方法,但只需要使用其中某些方法,可借助一个抽象类实现该接口的所有的方法,而我们只需写一个类继承该抽象类,重写需要的方法即可。类图如下:
示例代码如下:
接口Sourceable:
public interface Sourceable {
public void method1();
public void method2();
}
抽象类Wrapper2:
public abstract class Wrapper2 implements Sourceable{
public void method1(){}
public void method2(){}
}
实现类:
public class SourceSub1 extends Wrapper2 {
public void method1(){
System.out.println("the sourceable interface's first Sub1!");
}
}
public class SourceSub2 extends Wrapper2 {
public void method2(){
System.out.println("the sourceable interface's second Sub2!");
}
}
适配器模式的本质是:转换匹配,复用功能。适配器模式中被适配的接口Adaptee与适配的接口Target没有关系,他们中的方法可以相同,也可以完全不同,适配器模式的实现方式是通过组合对象的方式进行的,将功能委托给被适配的对象进行的。
适配器模式调用的序列图如下所示:
适配器模式的实现有以下几种:
常见适配:适配器类会实现接口,在实现过程中调用待适配的类中的方法
缺省适配:即对接口的缺省实现,即接口适配器模式。
此外,在适配过程中,可能接口功能的实现需要多个待适配类中的方法交互才能满足需求,即同时适配多个类。适配实现的复杂度取决于待适配类与接口的相似度,相似程度越高,适配类的实现难度越低。
在实际项目过程中,通常会存在两个版本共存的情况,这就是需要使用到双向适配器。示例代码如下:
两个版本的实现代码:
public interface Targetable1 {
public void produce1();
}
public class Target1 implements Targetable1 {
@Override
public void produce1() {
System.out.println("Targetable1的produce1实现");
}
}
public interface Targetable2 {
public void produce2();
}
public class Target2 implements Targetable2 {
@Override
public void produce2() {
System.out.println("Targetable2的produce2实现");
}
}
适配器类的代码如下:
public class Adapter implements Targetable1, Targetable2 {
private Targetable1 target1;
private Targetable2 target2;
@Override
public void produce1() {
target1.produce1();
}
@Override
public void produce2() {
target2.produce2();
}
}
实际上,在使用适配器过程中存在一个问题:被适配的对象不兼容Adapter适配器类,这使得适配器类的适用范围受到限制。而双向适配器则解决了这样的问题,可以满足不同客户采用不同方式查看同一不同对象的需求。
优点:
缺点:
过多使用适配器,系统会比较混乱,不易理解
参考:文章主要参考《研磨设计模式》一书
标签:类的方法 测试 wrap java target over info end bst
原文地址:https://www.cnblogs.com/liuyi6/p/10344222.html