• 【设计模式】职责链模式


    职责链模式:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

    优点

    • 降低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。
    • 增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则。
    • 增强了给对象指派职责的灵活性。当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。
    • 责任链简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。
      缺点
    • 不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理。
    • 对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。
    • 职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会由于职责链的错误设置而导致系统出错,如可能会造成循环调用。
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
  • 相关阅读:
    cmake入门
    华为OD机试真题【最多颜色的车辆】
    linux C++注册程序退出信号处理的代码
    【听课笔记】复旦大学遗传学_09基因与演化
    基于FPGA的图像sobel边缘提取算法开发,包括tb测试文件以及matlab验证代码
    GFS分布式文件系统及其部署
    IDEA Spring环境搭建+简单入门(图文教程)
    动态规划算法(4)01背包问题
    PTA作业笔记——简单的输入输出
    金仓数据库KingbaseES安全指南--6.6. SSL客户端证书认证
  • 原文地址:https://blog.csdn.net/aoeaoao/article/details/127831951