适配器模式描述如何将类或者对象结合在一起形成更大的结构。将一个接口转换成客户希望的另一个接口,从而使接口不兼容的类可以一起工作,别名为包装器。既可以作为类结构型模型,也可以作为对象结构模型。
类适配器:
对象适配器:
其中Target表示抽象目标类,表示客户使用的特定接口,不能随意改动。Adapter表示适配器类,用于调用另一个接口也叫转换器,对Adaptee和Target适配。Adaptee表示适配者类,用于定义一个已经存在的接口改接口需要被适配。Client为客户类
如果是类适配器Adapter实现了Target接口,并且继承了Adaptee类,在实现Target接口的request();方法中直接调用从Adaptee继承过来的specifiRequest();方法。
如果是对象适配器Adapter继承了Target类,并且与Adaptee是关联关系。即在Adapter中定义了Adaptee对象。因此可以调用Adaptee中的方法。
类适配器中使用一个具体类吧适配者是配到目标接口中,这样适配者以及适配者子类都是用改适配器适配就不可行,不能同时适配多个适配者。当有多个适配者时只能创建多个适配器类。而对象适配器中同一个适配器类可以把多个不同适配者适配到一个目标。
实现一个双向适配器,使得猫可以学狗叫,狗可以学猫抓老鼠。
猫狗分别有接口ICat、IDog。两个接口具体实现CatImpl、DogImpl。适配器Adapter类实现接口,并且与接口关联。
IDog.java
public interface IDog {
public void dogLook();
public void wang();
}
ICat.java
public interface ICat {
public void catLook();
public void eat();
}
DogImpl.java
public class DogImpl implements IDog{
public void dogLook() {
// TODO Auto-generated method stub
System.out.println("狗的样子");
}
public void wang() {
// TODO Auto-generated method stub
System.out.println("狗汪汪叫");
}
}
CatImpl.java
public class CatImpl implements ICat{
public void catLook() {
// TODO Auto-generated method stub
System.out.println("猫的样子");
}
public void eat() {
// TODO Auto-generated method stub
System.out.println("猫抓老鼠");
}
}
Adapter.java
package softDes;
public class Adapter implements ICat,IDog{
private IDog DogImpl = null;
private ICat CatImpl = null;
/*public Adapter(IDog DogImpl ) {
// TODO Auto-generated constructor stub
this.DogImpl = DogImpl;
}
public Adapter(ICat CatImpl) {
// TODO Auto-generated constructor stub
this.CatImpl = CatImpl;
}*/
public Adapter(IDog DogImpl,ICat CatImpl) {
// TODO Auto-generated constructor stub
this.DogImpl = DogImpl;
this.CatImpl = CatImpl;
}
@Override
public void dogLook() {
// TODO Auto-generated method stub
System.out.println("狗模仿");
CatImpl.catLook();
}
@Override
public void wang() {
// TODO Auto-generated method stub
System.out.println("狗模仿");
CatImpl.eat();
}
@Override
public void catLook() {
// TODO Auto-generated method stub
System.out.println("猫模仿");
DogImpl.dogLook();
}
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("猫模仿");
DogImpl.wang();
}
}
Client.java
public class Client {
public static void main(String[] args) {
Adapter adapter = new Adapter(new DogImpl(),new CatImpl());
adapter.catLook();
adapter.eat();
System.out.println("**************");
adapter.dogLook();
adapter.wang();
}
}