状态模式【行为模式C++】

这篇具有很好参考价值的文章主要介绍了状态模式【行为模式C++】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.概述

       状态模式是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。

状态模式【行为模式C++】,设计模式,备忘录模式

  

2.结构

  • State(抽象状态类):定义一个接口用来封装与上下文类的一个特定状态相关的行为,可以有一个或多个行为。
  • ConcreteState(具体状态类):作为抽象状态类的子类,每个子类实现一个与上下文类的一个状态相关的行为。每个具体状态类对应上下文类的一个具体状态,不同的具体状态类其行为有所不同。
  • Context(上下文类):上下文类中维护一个具体状态的实例,通常有多种状态,负责具体状态的切换。

状态模式【行为模式C++】,设计模式,备忘录模式

3.实现 

3.1 实例类比

       在日常生活和工作开发中都有状态的问题。你如说马路上的红绿灯,这三个灯光就属于三种状态。再比如说我使用的文档系统,通常有草稿、审阅和批发部三种状态。

       在以往的概念里,我们都会使用if...esle这类语句进行设计,但是这种设计一旦后期的需求发生了改变,那么维护起来相当的复杂!

       一个 文档Document类。 文档可能会处于 草稿Draft 、 ​ 审阅中Moderation和 已发布Published三种状态中的一种。 文档的 publish发布方法在不同状态下的行为略有不同:

  • 处于 草稿状态时, 它会将文档转移到审阅中状态。
  • 处于 审阅状态时, 如果当前用户是管理员, 它会公开发布文档。
  • 处于 已发布状态时, 它不会进行任何操作。  
3.2 具体实现
#include <iostream>
#include <typeinfo>


class Context;

//抽象状态类
class State {
	
protected:
	Context *context_;

public:
	virtual ~State() {
	}

	void set_context(Context *context) {
		this->context_ = context;
	}

	virtual void Status() = 0;
	virtual void Handle() = 0;
};

//上下文类
class Context {
	
private:
	State *state_;

public:
	Context(State *state) : state_(nullptr) {
		this->TransitionTo(state);
	}
	~Context() {
		delete state_;
	}

	void TransitionTo(State *state) {
		std::cout << "Context: Transition to " << typeid(*state).name() << ".\n";
		if (this->state_ != nullptr)
			delete this->state_;
		this->state_ = state;
		this->state_->set_context(this);
	}
	
	void Request1() {
		this->state_->Status();
	}
	void Request2() {
		this->state_->Handle();
	}
};

//已发布状态
class PublishedState : public State {
public:
	void Status() override {
		std::cout << "处于已发布状态.\n";
	}
	void Handle() override {
		std::cout << "结束...\n";
	}
};

//审阅中状态
class ModerationState : public State {
public:
	void Status() override {
		std::cout << "处于审阅中状态.\n";
	};

	void Handle() override {
		this->context_->TransitionTo(new PublishedState);
	}
};


//草稿状态
class DraftState : public State {
public:
	void Status() override {
		std::cout << "处于草稿状态.\n";
	};

	void Handle() override {
		this->context_->TransitionTo(new ModerationState);
	}
};


/**
 * The client code.
 */
void ClientCode() {
	Context *context = new Context(new DraftState);
	context->Request1();
	context->Request2();
	//
	context->Request1();
	context->Request2();
	//
	context->Request1();
	context->Request2();
	delete context;
}

int main() {
	ClientCode();
	return 0;
}
3.3运行结果
状态模式【行为模式C++】,设计模式,备忘录模式

4.状态设计模式优缺点

优点:

      通常对有状态的对象进行编程,我们的解决方案是:思考可能存在的所有状态,然后使用 if-else 或 switch-case 语句来进行状态判断,然后再根据不同的状态进行不同的处理。

      大量的if...else的缺点很明显

  1. 违背开闭原则: 当增加一种状态的时候, 需要修改原来的逻辑
  2. 当状态很多的时候, 代码段很长, 臃肿, 不容易维护, 可扩展性差.

     状态模式可以很好地解决这个问题。封装了转换规则,消除了 if-else、switch-case 等条件判断语句,代码更有层次性,且具备良好的扩展力, 可维护性

缺点
  1. 状态模式的使用必然会增加系统类和对象的个数。
  2. 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。
  3. 状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。

5.应用场景

  1. 一个操作中含有庞大的多分支结构,并且这些分支取决于对象的状态。
  2. 对象的行为依赖于它的状态(例如某些属性值),状态的改变将导致行为的变化。


 文章来源地址https://www.toymoban.com/news/detail-856094.html

到了这里,关于状态模式【行为模式C++】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式之备忘录模式(Memento)的C++实现

    在软件功能开发过程中,某些对象的状态在转换过程中,由于业务场景需要,要求对象能够回溯到对象之前某个点的状态。如果使用一些共有接口来让其他对象得到对象的状态,便会暴露对象的实现细节。备忘录模式是在不破坏对象封装性的前提下,增加一个备忘录类,用于

    2024年02月12日
    浏览(43)
  • (三)行为模式:6、备忘录模式(Memento Pattern)(C++示例)

    目录 1、备忘录模式(Memento Pattern)含义 2、备忘录模式的UML图学习 3、备忘录模式的应用场景 4、备忘录模式的优缺点 (1)优点: (2)缺点 5、C++实现备忘录模式的实例 1、备忘录模式(Memento Pattern)含义 备忘录(Memento):在不破坏封装性的前提下,捕获一个对象的内部状

    2024年02月10日
    浏览(44)
  • 【设计模式】备忘录模式

    主页传送门: 💁 传送        备忘录(Memento Pattern)模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式。。其定义如下: Without violating encapsulation,capture and externalize an object’s internal state so that the object can be restored to this state later.        即:在不破坏封

    2024年02月07日
    浏览(54)
  • 设计模式——备忘录模式

    备忘录模式(Memento Pattern)是一种行为型设计模式,它在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样可以在需要时将对象恢复到先前的状态。 发起人(Originator): 是拥有复杂内部状态的对象,它可以创建和恢复备忘录。 备忘录(M

    2024年01月19日
    浏览(43)
  • 《设计模式》备忘录模式

    定义 : 备忘录模式又称为快照模式或者令牌模式, 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。 属性 行为型 模式。 备忘录模式的角色组成 : Originator(发起人) :负责创建一个 Memento

    2024年02月06日
    浏览(45)
  • 设计模式-备忘录模式

    备忘录模式(Memento Pattern)是计算机科学中的一种行为设计模式。它提供了一种在不破坏封装性的前提下,捕获和恢复对象内部状态的方法。这种模式主要用于在用户需要回滚到对象的某个先前状态时,能够实现状态的还原。 在备忘录模式中,主要涉及到三个角色: Origina

    2024年01月23日
    浏览(48)
  • Java设计模式-备忘录模式

    一、概述 备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原,很多软件都提供了撤销(Undo)操作,如 Word、记事本、Photoshop、IDEA等软件在编辑时按 Ctrl+Z

    2024年01月21日
    浏览(51)
  • 【前端设计模式】之备忘录模式

    设计模式是在软件开发中经过验证的解决问题的方法。它们是从经验中总结出来的,可以帮助我们更好地组织和管理代码,提高代码的可维护性、可扩展性和可重用性。无论是前端还是后端开发,设计模式都扮演着重要的角色。在本专栏中,我们将探索一些常见的前端设计模

    2024年02月05日
    浏览(43)
  • 03-JAVA设计模式-备忘录模式

    Java中的备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后可以将对象恢复到原先保存的状态。 主要角色包括: 发起者(Originator):需要保存和恢复状态的对象。它记录当前

    2024年04月26日
    浏览(43)
  • 《设计模式的艺术》笔记 - 备忘录模式

            备忘录模式在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。它是一种对象行为模式,别名为Token。 myclass.h myclass.cpp main.cpp         1. 它提供了一种状态恢复的实现机制,使得用户可

    2024年01月24日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包