设计模式-适配器模式

(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

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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值