实验8:适配器模式

实验8:适配器模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:

1、理解适配器模式的动机,掌握该模式的结构;

2、能够利用适配器模式解决实际问题。

 
   

 


[实验任务一]:双向适配器

实现一个双向适配器,使得猫可以学狗叫,狗可以学猫抓老鼠。

实验要求:

1.画出对应的类图;

 

 

 

2.提交源代码;

JAVA

Cat接口(另一个类似):

public interface Cat {

  void cry();

  void catchMouse();

}

实体Cat类(另一个类似):

public class ConcreteCat implements Cat{

    @Override

    public void cry() {

        System.out.println("猫叫");

    }

    @Override

    public void catchMouse() {

        System.out.println("猫抓老鼠");

    }

}

适配器类:

public class Adapter implements Dog,Cat{

    private Cat cat;

    private Dog dog;

    public Cat getCat() {

        return cat;

    }

    public void setCat(Cat cat) {

        this.cat = cat;

    }

    public Dog getDog() {

        return dog;

    }

    public void setDog(Dog dog) {

        this.dog = dog;

    }

    @Override

    public void cry() //猫学狗叫

    {

       System.out.print( "猫学");

        dog.wang();

    }

    @Override

    public void catchMouse() {

        cat.catchMouse();

    }

    @Override

    public void wang() {

        dog.wang();

    }

    @Override

    public void action() //狗学猫抓老鼠

    {

        System.out.print( "狗学");

        cat.catchMouse();

    }

}

}

Test测试类:

public class Test {

    public static void main(String args[])

    {

        Cat cat1 = new ConcreteCat();

        Dog dog1 = new ConcreteDog();

        Adapter A1 = new Adapter();

        A1.setCat(cat1);

        A1.setDog(dog1);

        cat1 = (Cat) A1;

        cat1.catchMouse();

        cat1.cry();

        dog1 = (Dog) A1;

        dog1.action();

    }

}

C++

#include<iostream>

#include<string>

#include"tinyxml2.h"

using namespace std;

using namespace tinyxml2;

class  CatTarget {

public: virtual void catchMouse() = 0;

};

class ConcreteCatTarget:public CatTarget {

public: void catchMouse() {

        cout<<"抓老鼠"<<endl;

    }

};

class DogAdaptee {

public: virtual void wang()=0;

};

class ConcreteDogAdaptee:public DogAdaptee {

public: void wang() {

        cout<<"汪汪叫"<<endl;

    }

};

class Adapter:public CatTarget,public DogAdaptee {

private: CatTarget *catTarget;

         DogAdaptee *dogAdaptee;

public:

    Adapter() {

    }

    void setCatTarget(CatTarget *catTarget) {

        this->catTarget = catTarget;

    }

    void setDogAdaptee(DogAdaptee *dogAdaptee) {

        this->dogAdaptee = dogAdaptee;

    }

    void catchMouse() {

        cout<<"猫学狗叫,即目标类调用适配者中的方法:"<<endl;

        dogAdaptee->wang();

    }

    void wang(){

        cout<<"狗学猫抓老鼠,即适配者调用目标类中的方法:"<<endl;

        catTarget->catchMouse();

    }

};

int  main() {

        //适配器

        Adapter *adapter=new Adapter();

    //    XMLDocument xml;

    //    xml.LoadFile("config.xml");

    //    XMLElement *category = xml.RootElement();

    //    XMLElement *con = category->FirstChildElement("className");

        //cout << "13233";

        //目标类通过适配器调用适配者方法

    //    XMLElement* adp = con->FirstChildElement();

    //    XMLElement *next1 = adp->NextSiblingElement();

        adapter->setCatTarget(new ConcreteCatTarget());

        adapter->wang();

    //    cout << next1->GetText() << endl;

        //适配者通过适配器调用目标类方法

    //    XMLElement *next2 = next1->NextSiblingElement();

        adapter->setDogAdaptee(new ConcreteDogAdaptee());

        adapter->catchMouse();

    }

 

 

 

3.注意编程规范。

posted @ 2022-10-27 10:30  萧贾jzm  阅读(62)  评论(0编辑  收藏  举报
//歌单id