(1)案例背景:
在课堂上我们学习了单向适配器的使用和实现,现在我们需要实现一个双向适配器,编写代码,使用Java语言实现双向适配器,使猫可以学狗叫,狗可以学猫抓老鼠,请绘制相应类图并实现。(课本167页第三题)
(2)实现步骤:
- 根据题意,画出双向适配器的类图,类图中应该包含一个适配器类Adapter;两个抽象类Cat类和Dog类,Cat类中有发出叫声的方法cry()和捉老鼠的方法catchMouse(),Dog类中有发出狗叫声的方法wang()和动作方法action();两个具体适配者类ConcreteCat类和ConcreteDog类,两个抽象类互为抽象目标和抽象适配者,如果客户端针对Cat类编程,则Cat类充当抽象目标,Dog类充当抽象适配者,ConcreteCat类充当具体适配者,反之同理。
- 根据类图,实现上述类的具体代码以及用户类Client,由于本题中只有一个适配器类Adapter,所以不需要通过XML文件来改变用户类的操作
- 编译并运行代码,观察是否能让猫发出狗叫声和让狗实现抓老鼠的动作。
(3)案例总结:
在以下情况下可以使用适配器模式:
- 系统需要使用一些现有的类,而这些类的接口丌符合系统的需要, 甚至没有这些类的源代码
- 创建一个可以重复使用的类,用于和一些彼此之间没有太大关联 的类,包括一些可能在将来引进的类一起工作
代码结构:
详细代码:
Cat.java:
package Adapter;
public interface Cat {
public void cry();
// public void cry(){
// System.out.println("小猫叫!");
// }
public void catchMouse();
// public void catchMouse(){
// System.out.println("小猫捉老鼠!");
// }
}
Dog.java:
package Adapter;
public interface Dog {
public void wang();
// {
// System.out.println("小狗叫!");
// }
public void action();
// {
// System.out.println("小狗动!");
// }
}
ConcreateCat.java:
package Adapter;
public class ConcreateCat implements Cat{
@Override
public void cry(){
System.out.println("小猫叫!");
}
@Override
public void catchMouse(){
System.out.println("小猫捉老鼠!");
}
}
ConcreateDog.java:
package Adapter;
public class ConcreateDog implements Dog{
@Override
public void wang(){
System.out.println("小狗叫!");
}
@Override
public void action(){
System.out.println("小狗动!");
}
}
Adapter.java:
package Adapter;
public class Adapter implements Cat,Dog{
Dog dog ;
Cat cat ;
public Adapter(Dog dog){
this.dog = dog;
}
public Adapter(Cat cat){
this.cat = cat;
}
@Override
public void wang() {
System.out.println("小狗叫!");
}
@Override
public void action() {
cat.catchMouse();
}
@Override
public void cry() {
System.out.println("小猫叫!");
}
@Override
public void catchMouse() {
dog.action();
}
}
Client.java:
package Adapter;
import javafx.scene.shape.ClosePathBuilder;
public class Client {
public static void main(String[] args) {
System.out.println("详细设计实验报告 1904班白旭君 2019005368");
Cat cat = new Adapter(new ConcreateDog());
cat.cry();
cat.catchMouse();
Dog dog = new Adapter(new ConcreateCat());
dog.wang();
dog.action();
}
}
实验结果:
写双向适配器的时候由于还未完全掌握将类图转变为代码的能力,也不太理解双向适配器的核心思想,于是查阅许多资料,经过反复修改,最终借鉴一个帖子
https://blog.csdn.net/qq_45703570/article/details/123807427
完成了编码。但是虽然完成了最终要求的目的,但是总觉得怪怪的,好像没有用到适配器模式的核心思想的样子。看来还是学无止境呀。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/128202.html