今天我们的主人公是泰兴小县城大威德养的一条 射天设地的泰迪狗 -- 泰日天 ,真的是什么样的人养什么样的狗,下半身的大威德 养的狗都不一般
一天泰日天刚吃完翔,突然看到主人大威德的丰盛早餐,垂涎欲滴,忽然觉得刚刚吃的津津有味的翔不香了,但是狗怎么能吃主人的食物呢,
所以 适配器模式上线了
既然是设配器那就有3要素
1。 目标(Target)接口:定义客户所需接口,当前系统业务所期待的接口。(大威德的早饭)
2。 适配者(Adaptee)类:需要被适配的角色,它是已经存在的类或对象。(泰日天吃翔)
3。 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,它的职责就是要把适配者转换成目标角色 ,它通过继承Target并关联一个Adaptee对象使二者产生联系 (吃完翔的泰迪要吃主人的食物)
/**
* 源角色 --- adapee
* 狗吃狗粮,吃的翔
*/
public interface DogEat {
void eatShit();
}
class DogEatImpl implements DogEat{
@Override
public void eatShit() {
System.out.println("泰日天吃--翔、翔、翔");
}
}
/**
* 目标角色 --- target
* 大威德吃的食物
* */
public interface PeopleEat {
void eatFood();
}
class PeopleEatImpl implements PeopleEat{
@Override
public void eatFood() {
System.out.println("吃大威德吃的烧饼,油条");
}
}
/**
* 适配器角色 --- Adaper
* 定义适配器类,把狗变成大威德
*/
public class DogAdapterPeople implements DogEat{
private PeopleEat peopleEat;
public DogAdapterPeople(PeopleEat peopleEat) {
this.peopleEat = peopleEat;
}
public void eatShit() {
System.out.println("使用转换器 把狗 变成大威德");
// 调用大威德吃食的方法
peopleEat.eatFood();
}
}
public class TaidiDog {
public void eatShit(DogEat dogEat){
if(dogEat == null){
throw new NullPointerException("请先传入泰迪狗");
}
dogEat.eatShit();
}
}
测试类:
public class Client {
public static void main(String[] args) {
/** 泰迪狗天天吃翔吃狗粮吃腻了,想跟大威德一起吃饭 */
TaidiDog taidiDog = new TaidiDog();
DogEat dawed = new DogEatImpl();
taidiDog.eatShit(dawed);
System.out.println("------------");
PeopleEat david = new PeopleEatImpl();
DogAdapterPeople adapter = new DogAdapterPeople(david);
taidiDog.eatShit(adapter);
}
}
运行结果:
泰日天吃--翔、翔、翔
------------
使用转换器 把狗 变成大威德
吃大威德吃的烧饼,油条
优点:可以让任何两个没有关联的类一起运行,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构