实验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.注意编程规范。