一 作用
将抽象部份与它的实现部份分离,使它们都可以独立地变化。将抽象(Abstraction)与实现(Implementation)分离,使得二者可以独立地变化。
二 UML类图
三 举个栗子
#pragma once
#include <iostream>
class AbstractionImplement {
public:
virtual ~AbstractionImplement() = default;
virtual void operation() = 0;
};
class ConcreteAbstractionImplementA :public AbstractionImplement
{
public:
void operation() override {
std::cout << "ConcreteAbstractionImplementA operation" << std::endl;
}
};
class ConcreteAbstractionImplementB :public AbstractionImplement
{
public:
void operation() override {
std::cout << "ConcreteAbstractionImplementB operation" << std::endl;
}
};
#pragma once
#include <memory>
#include "abstraction_implement.h"
class Abstraction {
public:
virtual ~Abstraction() = default;
virtual void operation() = 0;
};
class RefinedAbstraction :public Abstraction {
public:
RefinedAbstraction(std::shared_ptr<AbstractionImplement> abs_imp_ptr):abs_imp_ptr_(abs_imp_ptr){}
void operation()override {
std::cout << "RefinedAbstractionA operation\n";
abs_imp_ptr_->operation();
}
private:
std::shared_ptr<AbstractionImplement> abs_imp_ptr_;
};
class RefinedBbstraction :public Abstraction {
public:
RefinedBbstraction(std::shared_ptr<AbstractionImplement> abs_imp_ptr) :abs_imp_ptr_(abs_imp_ptr) {}
void operation()override {
std::cout << "RefinedAbstractionB operation\n";
abs_imp_ptr_->operation();
}
private:
std::shared_ptr<AbstractionImplement> abs_imp_ptr_;
};
#include "abstraction.h"
int main(int argc, char* argv[]) {
std::shared_ptr<AbstractionImplement> abs_impa_ptr = std::make_shared<ConcreteAbstractionImplementA>();
std::shared_ptr<Abstraction> absa_ptr = std::make_shared<RefinedAbstraction>(abs_impa_ptr);
absa_ptr->operation();
std::shared_ptr<AbstractionImplement> abs_impb_ptr = std::make_shared<ConcreteAbstractionImplementB>();
std::shared_ptr<Abstraction> absb_ptr = std::make_shared<RefinedBbstraction>(abs_impb_ptr);
absb_ptr->operation();
return 0;
}