职责链模式:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
优点:
enum class Answer{YSE,NO};
class Responsibility
{
public:
virtual Answer CanIHave() = 0;
virtual ~Responsibility(){}
};
class Mom : public Responsibility
{
public:
Answer CanIHave()
{
return Answer::NO;
}
~Mom(){}
};
class Dad :public Responsibility
{
public:
Answer CanIHave()
{
return Answer::NO;
}
~Dad(){}
};
class GrandMother :public Responsibility
{
public:
Answer CanIHave()
{
return Answer::NO;
}
~GrandMother(){}
};
class GrandFather :public Responsibility
{
public:
Answer CanIHave()
{
return Answer::YSE;
}
~GrandFather(){}
};
class Son :public Responsibility
{
private:
std::vector<std::shared_ptr<Responsibility>> chain_;
public:
Son()
{
chain_.push_back(std::shared_ptr<Responsibility>(new (Mom)));
chain_.push_back(std::shared_ptr<Responsibility>(new (Dad)));
chain_.push_back(std::shared_ptr<Responsibility>(new (GrandFather)));
chain_.push_back(std::shared_ptr<Responsibility>(new (GrandMother)));
}
Answer CanIHave()
{
for (auto x : chain_)
{
if (x->CanIHave() == Answer::YSE)
{
return Answer::YSE;
}
}
return Answer::NO;
}
~Son(){}
};
int main()
{
Son s;
if (s.CanIHave() == Answer::YSE)
{
std::cout << "Problems have been resolved" << std::endl;
}
else
{
std::cout << "Problems was not solved" << std::endl;
}
return 0;
}