设计模式-适配器模式
(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
完成了编码。但是虽然完成了最终要求的目的,但是总觉得怪怪的,好像没有用到适配器模式的核心思想的样子。看来还是学无止境呀。