设计模式——适配器模式
(1)目的:使原本由于接口不兼容而不能一起工作的类可以一起工作。
(2)如何实现:
1.定义一个父类(Target),父类中包含一个虚方法,子类实现这个虚方法。
2.定义一个适配器类(Adapter),继承于父类,适配器类中包含一个需要适配的类(Adaptee),适配器类中实现父类某一虚方法,实际上是调用需要适配的类中的方法。
(3)优点:
1.将名称不同的接口转换为目标接口。
(4)缺点:
1.增加了适配器类,应该考虑在架构时就统一类名。
│ adapter.cpp
│ adapter.h
│ AdapterModel.cpp
│ chinese_grade.cpp
│ chinese_grade.h
│ english_grade.cpp
│ english_grade.h
│ grade.cpp
│ grade.h
│ math_grade.cpp
│ math_grade.h
│ grade.h(Target)
#pragma once
#include <iostream>
class Grade
{
public:
void virtual GetFenshu()=0;
};
│ adapter.h(Adapter)
#pragma once
#include "grade.h"
#include "english_grade.h"
class Adapter :
public Grade
{
private:
EnglishGrade* ptr = nullptr;
public:
Adapter();
void GetFenshu();
};
│ english_grade.h(Adaptee)
#pragma once
#include<iostream>
class EnglishGrade
{
public:
void GetGrade();
};
│ math_grade.h
#pragma once
#include "grade.h"
class Math_Grade :
public Grade
{
public:
void GetFenshu();
};
│ chinese_grade.h
#pragma once
#include<iostream>
#include "grade.h"
class Chinese_Grade :
public Grade
{
public:
void GetFenshu();
};
│ grade.cpp
#include "grade.h"
│ adapter.cpp
#include "adapter.h"
Adapter::Adapter()
{
ptr = new EnglishGrade();
}
void Adapter::GetFenshu()
{
ptr->GetGrade();
}
│ english_grade.cpp
#include "english_grade.h"
void EnglishGrade::GetGrade()
{
std::cout << "English grade:" << 95 << std::endl;
}
│ math_grade.cpp
#include "math_grade.h"
void Math_Grade::GetFenshu()
{
std::cout << "数学分数为:" << 65 << std::endl;
}
│ AdapterModel.cpp
#include <iostream>
#include "adapter.h"
#include "chinese_grade.h"
#include "math_grade.h"
int main()
{
Grade* p1 = new Chinese_Grade();
Grade* p2 = new Math_Grade();
Grade* p3 = new Adapter();
p1->GetFenshu();
p2->GetFenshu();
p3->GetFenshu();
}