适配器模式:双向适配器
介绍:由名字可知,该适配器既可以将目标接口适配成被适配者,也可以将被适配者适配成目标接口(前者其实只是将目标接口与被适配者接口角色互换)
定义:在对象适配器的使用过程中,如果在适配器中同时包含对目标类和适配者类的对象引用(即同时依赖于被适配者类和目标接口),适配者可以通过调用目标接口中的方法,目标接口也可以通过它调用适配者类中的方法,那么该适配器就是一个双向适配器。
以下是关于双向适配器的代码示例:
public interface Duck //目标接口(因为在双向适配器模式的情况下,所以他同时也是被适配者)
{
public void quack();
public void Dfly();
}
public class ConcreteDuck implements Duck //目标接口的具体实现类(也可以说是被适配者接口的具体实现类——因为他可以有两种不同的角色:被适配者或者接口)
{
public void quack() {
System.out.println("我是一个真正的鸭子");
}
public void Dfly() {
int distance=100;
System.out.println("我能飞行"+distance+"米");
}
}
public interface Turkey { //被适配者类(同时也可以是目标接口类)
public void speak();
public void Tfly();
}
public class wildturkey implements Turkey{
public void speak() {
System.out.println("我是一个火鸡");
}
public void Tfly() {
int distance=20;
System.out.println("我只能飞行"+distance+"米");
}
}
public class adapter implements Duck,Turkey //双向适配器,既实现了目标接口,又实现了被适配者接口(其实也是目标接口)
{ //注意:适配器类只实现目标接口(因为双向适配器,便于区分:所以说其既实现了目标接口,又实现了被适配者接口(其实被适配者接口也是目标接口))
Duck duck;
Turkey turkey;
public adapter(Duck duck) //此时代表turkey接口是目标接口,将duck对象进行适配
{
this.duck=duck;
}
public void quack() {
duck.quack();
}
public void Dfly() {
duck.Dfly();
System.out.println("我能飞行上述距离的五分之一"); //将duck适配成火鸡后们需要将其fly方法进行修改,使其实现目标接口(turkey)的飞行距离(包装——给duck穿上了turkey的衣服)
}
public adapter(Turkey turkey) //此时代表duck接口是目标接口,将turkey对象进行适配
{
this.turkey=turkey;
}
public void speak()
{
turkey.speak();
}
public void Tfly()
{
turkey.Tfly();
System.out.println("我能飞行上述距离的5倍"); //将火鸡适配成duck后,需要将其fly方法进行修改,使实现目标接口(duck)的飞行距离(包装——给turkey穿上了duck的衣服)
}
}
public class client { //客户类,通过客户与目标接口进行交互(客户类不与被适配者类直接交互)
public void testturkey(Turkey turkey) //说明客户想要测试turkey类
{
turkey.Tfly();
turkey.speak();
}
public void testduck(Duck duck) //说明客户想要测试duck类
{
duck.Dfly();
duck.quack();
}
}
public class test {
public static void main(String[] args) {
// TODO code application logic here
ConcreteDuck duck=new ConcreteDuck(); //创建一个具体的鸭子对象
wildturkey turkey=new wildturkey(); //创建一个具体的鸭子对象
adapter aaa=new adapter(duck); //将duck适配称火鸡
adapter bbb=new adapter(turkey); //将火鸡适配成了duck
client ccc=new client(); //创建一个客户对象,根据客户需要调用鸭子还是火鸡(还是将两者进行适配后调用)
ccc.testduck(aaa);
System.out.println();
ccc.testturkey(bbb);
}
}