设计模式-适配器模式

(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

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

 
 
posted @ 2022-04-22 10:11  临易  阅读(218)  评论(0编辑  收藏  举报