实验8:适配器模式

发布时间 2024-01-09 15:05:25作者: wardream

 

 


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

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

实验要求:

1.  画出对应的类图;

 

 

2.  提交源代码;

public class Adapter implements CatTarget, DogAdaptee {

 

    private CatTarget cattarget;

    private DogAdaptee dogadaptee;

    public Adapter() {

        // TODO Auto-generated constructor stub

    }

 

    public void setCattarget(CatTarget cat) {

        this.cattarget=cat;

    }

    public void setDogAdaptee(DogAdaptee dog) {

        this.dogadaptee=dog;

    }

    @Override

    public void wang() {

        // TODO Auto-generated method stub

 

        System.out.println("猫学狗汪汪叫");

        cattarget.catchMouse();

 

    }

 

    @Override

    public void catchMouse() {

        // TODO Auto-generated method stub

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

        cattarget.catchMouse();

 

        dogadaptee.wang();

    }

 

}

 

 

 

 

public interface CatTarget {

 

    public abstract void catchMouse();

}

 

 

 

 

public class ConcreteCatTarget implements CatTarget {

 

   

    @Override

    public void catchMouse() {

        // TODO Auto-generated method stub

 

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

    }

 

}

 

 

 

 

public class ConcreteDogAdaptee implements DogAdaptee{

 

 

    @Override

    public void wang() {

        // TODO Auto-generated method stub

       

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

    }

 

}

 

 

 

 

public interface DogAdaptee {

 

    public abstract void wang();

 

}

 

 

 

 

public class Client {

    public static void main(String[] args) {

        //适配器

        Adapter adapter = (Adapter) XMLUtil.getBean("adapterPattern");

 

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

        CatTarget concreteCatTarget = (ConcreteCatTarget) XMLUtil.getBean("adapterPatternTarger");

        adapter.setCattarget(concreteCatTarget);

        adapter.wang();

 

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

        DogAdaptee concreteDogAdaptee = (ConcreteDogAdaptee) XMLUtil.getBean("adapterPatternAdaptee");

        adapter.setDogAdaptee(concreteDogAdaptee);

        adapter.catchMouse();

    }

}

 

 

 

 

#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();

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

        adapter->setCatTarget(new ConcreteCatTarget());

        adapter->wang();

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

        adapter->setDogAdaptee(new ConcreteDogAdaptee());

        adapter->catchMouse();

    }

3.注意编程规范。