当前位置: 首页 > news >正文

网站赚流量关键词优化一般收费价格

网站赚流量,关键词优化一般收费价格,网站域名变更,中央广播电视总台简称什么是状态模式? 状态模式是一种行为型设计模式,它允许一个对象在其内部状态发生改变时,动态改变其行为。通过将状态相关的逻辑封装到独立的类中,状态模式能够将状态管理与行为解耦,从而让系统更加灵活和可维护。 通…

什么是状态模式?

状态模式是一种行为型设计模式,它允许一个对象在其内部状态发生改变时,动态改变其行为。通过将状态相关的逻辑封装到独立的类中,状态模式能够将状态管理与行为解耦,从而让系统更加灵活和可维护。

通俗理解

想象一个自动售货机,它有以下几种状态:

  1. 无硬币状态:等待用户投入硬币。
  2. 有硬币状态:用户可以选择商品。
  3. 售货状态:用户选择商品后,售货机正在出货。
  4. 缺货状态:商品已售罄。

售货机的行为完全依赖于当前的状态,比如:

  • 无硬币状态下,用户无法选择商品。
  • 有硬币状态下,用户可以选择商品。
  • 售货状态下,售货机执行出货操作。

状态模式的核心就是:将状态逻辑抽象为独立的状态类,并通过上下文类(如售货机)动态切换状态对象,进而改变对象的行为。


状态模式的特点

优点
  1. 清晰封装状态逻辑

    • 每种状态的逻辑被集中到对应的状态类中,逻辑清晰且易于管理。
  2. 动态切换行为

    • 对象的行为可以通过切换状态动态改变,无需修改上下文类的代码。
  3. 扩展性强

    • 新增状态只需添加新的状态类,不影响现有代码,符合开闭原则
缺点
  1. 类的数量增加

    • 每种状态都需要一个单独的类,可能导致类数量较多。
  2. 状态切换逻辑分散

    • 状态之间的切换逻辑分布在多个状态类中,增加了维护的复杂性。

状态模式的结构

UML类图
         +---------------------+|       Context       |   // 上下文类,管理当前状态+---------------------+|  - state: State     ||  + setState(state)  ||  + request()        |+---------------------+^|+---------------------+|       State         |   // 抽象状态类+---------------------+|  + handle()         |+---------------------+^|+----------------------+  +----------------------+|  ConcreteStateA      |  |  ConcreteStateB      |   // 具体状态类+----------------------+  +----------------------+|  + handle()          |  |  + handle()          |+----------------------+  +----------------------+
组成部分
  1. State(抽象状态类)

    • 定义了所有状态的通用接口,例如insertCoin()selectProduct()等。
  2. ConcreteState(具体状态类)

    • 实现State接口,定义与特定状态相关的行为。
  3. Context(上下文类)

    • 持有一个状态对象,调用当前状态的行为。
    • 负责在运行时切换状态对象。

案例:自动售货机

需求描述

设计一个简单的自动售货机,支持以下功能:

  1. 无硬币状态:用户不能选择商品。
  2. 有硬币状态:用户可以选择商品。
  3. 售货状态:用户选择商品后,售货机出货。
目标
  • 实现售货机的状态管理,使得行为随着状态变化而动态改变。
  • 状态切换应简单且易于扩展。

完整代码实现

以下是状态模式在自动售货机中的应用,输出为中文,附带详细注释。

#include <iostream>
#include <memory>
#include <string>// 抽象状态类
class State {
public:virtual void insertCoin() = 0;      // 投入硬币virtual void selectProduct() = 0;  // 选择商品virtual void dispenseProduct() = 0; // 出货virtual ~State() = default;
};// 前向声明:解决状态类互相引用的问题
class VendingMachine;
class HasCoinState;// 上下文类:自动售货机
class VendingMachine {
private:std::shared_ptr<State> currentState; // 当前状态public:void setState(std::shared_ptr<State> state) {currentState = state; // 切换状态}// 调用当前状态的方法void insertCoin() {currentState->insertCoin();}void selectProduct() {currentState->selectProduct();}void dispenseProduct() {currentState->dispenseProduct();}
};// 具体状态类:无硬币状态
class NoCoinState : public State {
private:VendingMachine* machine; // 上下文public:explicit NoCoinState(VendingMachine* machine) : machine(machine) {}void insertCoin() override {std::cout << "硬币已投入,进入有硬币状态。" << std::endl;machine->setState(std::static_pointer_cast<State>(std::make_shared<HasCoinState>(machine))); // 切换到有硬币状态}void selectProduct() override {std::cout << "请先投入硬币。" << std::endl;}void dispenseProduct() override {std::cout << "请先投入硬币并选择商品。" << std::endl;}
};// 具体状态类:有硬币状态
class HasCoinState : public State {
private:VendingMachine* machine;public:explicit HasCoinState(VendingMachine* machine) : machine(machine) {}void insertCoin() override {std::cout << "硬币已存在,请选择商品。" << std::endl;}void selectProduct() override {std::cout << "商品已选择,正在出货。" << std::endl;machine->setState(std::static_pointer_cast<State>(std::make_shared<NoCoinState>(machine))); // 模拟出货后切换到无硬币状态}void dispenseProduct() override {std::cout << "请先选择商品。" << std::endl;}
};// 客户端代码
int main() {// 创建自动售货机并设置初始状态VendingMachine machine;machine.setState(std::make_shared<NoCoinState>(&machine));// 测试售货机的功能std::cout << "=== 测试场景 1:无硬币状态 ===" << std::endl;machine.selectProduct(); // 未投硬币时选择商品machine.insertCoin();    // 投入硬币std::cout << "\n=== 测试场景 2:有硬币状态 ===" << std::endl;machine.selectProduct(); // 投币后选择商品return 0;
}

运行结果

=== 测试场景 1:无硬币状态 ===
请先投入硬币。
硬币已投入,进入有硬币状态。=== 测试场景 2:有硬币状态 ===
商品已选择,正在出货。

代码解读

1. 抽象状态类(State
class State {
public:virtual void insertCoin() = 0;virtual void selectProduct() = 0;virtual void dispenseProduct() = 0;virtual ~State() = default;
};
  • 定义了所有状态的接口。
  • 子类实现这些方法来处理具体的状态逻辑。
2. 上下文类(VendingMachine
class VendingMachine {
private:std::shared_ptr<State> currentState;public:void setState(std::shared_ptr<State> state) {currentState = state;}void insertCoin() {currentState->insertCoin();}void selectProduct() {currentState->selectProduct();}void dispenseProduct() {currentState->dispenseProduct();}
};
  • 持有当前状态对象,并将行为委托给当前状态。
  • 通过setState方法切换状态。
3. 具体状态类
  • 无硬币状态
void insertCoin() override {std::cout << "硬币已投入,进入有硬币状态。" << std::endl;machine->setState(std::static_pointer_cast<State>(std::make_shared<HasCoinState>(machine)));
}
  • 有硬币状态
void selectProduct() override {std::cout << "商品已选择,正在出货。" << std::endl;machine->setState(std::static_pointer_cast<State>(std::make_shared<NoCoinState>(machine)));
}

每个具体状态实现了当前状态的行为逻辑,同时可以切换到其他状态。


状态模式的应用场景

  1. 对象行为取决于状态

    • 自动售货机、订单状态管理、游戏角色状态(如站立、跑动、跳跃等)。
  2. 需要消除复杂条件判断

    • 替代if-elseswitch语句,将状态逻辑分散到独立的状态类中。

总结

状态模式是一种非常实用的设计模式,它通过将状态逻辑封装到独立的类中,动态改变对象的行为,从而提高代码的扩展性和可维护性。

核心优势
  1. 行为动态改变:通过切换状态对象,动态改变对象的行为。
  2. 易扩展:新增状态只需添加状态类,不影响现有代码。
  3. 逻辑清晰:每个状态的逻辑集中在对应的状态类中,代码更易于理解和维护。
典型应用
  • 自动售货机
  • 在线订单状态(待支付、已支付、已发货等)
  • 游戏角色状态(站立、奔跑、跳跃等)

文章转载自:
http://streambed.yzkf.cn
http://steamy.yzkf.cn
http://diarize.yzkf.cn
http://maryknoller.yzkf.cn
http://dogmatical.yzkf.cn
http://underbudgeted.yzkf.cn
http://hypsometrical.yzkf.cn
http://sapor.yzkf.cn
http://neuk.yzkf.cn
http://kousso.yzkf.cn
http://cholecalciferol.yzkf.cn
http://roadability.yzkf.cn
http://drunkometer.yzkf.cn
http://gastroschisis.yzkf.cn
http://foggy.yzkf.cn
http://matchmaking.yzkf.cn
http://schema.yzkf.cn
http://kimberley.yzkf.cn
http://practician.yzkf.cn
http://tetraphonic.yzkf.cn
http://decrier.yzkf.cn
http://supercoil.yzkf.cn
http://antipole.yzkf.cn
http://unga.yzkf.cn
http://broadleaf.yzkf.cn
http://boating.yzkf.cn
http://saleslady.yzkf.cn
http://cathodal.yzkf.cn
http://attemperator.yzkf.cn
http://radiant.yzkf.cn
http://mismanage.yzkf.cn
http://neurogenic.yzkf.cn
http://fetish.yzkf.cn
http://introvertive.yzkf.cn
http://sellanders.yzkf.cn
http://remindful.yzkf.cn
http://pyknic.yzkf.cn
http://ingestion.yzkf.cn
http://grand.yzkf.cn
http://tetrodotoxin.yzkf.cn
http://plumbate.yzkf.cn
http://dermatologic.yzkf.cn
http://bonze.yzkf.cn
http://featherlight.yzkf.cn
http://absorptance.yzkf.cn
http://inertness.yzkf.cn
http://aeromodelling.yzkf.cn
http://forwardly.yzkf.cn
http://educationally.yzkf.cn
http://setoff.yzkf.cn
http://bloodshedding.yzkf.cn
http://spectator.yzkf.cn
http://heckelphone.yzkf.cn
http://attemperator.yzkf.cn
http://hypostatic.yzkf.cn
http://designer.yzkf.cn
http://alimentation.yzkf.cn
http://urinary.yzkf.cn
http://venography.yzkf.cn
http://unshirkable.yzkf.cn
http://locative.yzkf.cn
http://embryonal.yzkf.cn
http://slotware.yzkf.cn
http://standoffishly.yzkf.cn
http://dichroiscope.yzkf.cn
http://adolphus.yzkf.cn
http://srv.yzkf.cn
http://nonofficeholding.yzkf.cn
http://tranter.yzkf.cn
http://shim.yzkf.cn
http://professionalize.yzkf.cn
http://jockstrap.yzkf.cn
http://paperbelly.yzkf.cn
http://rhinopharynx.yzkf.cn
http://exigible.yzkf.cn
http://bailey.yzkf.cn
http://svelte.yzkf.cn
http://portosystemic.yzkf.cn
http://glandered.yzkf.cn
http://amygdala.yzkf.cn
http://hibernian.yzkf.cn
http://unsearched.yzkf.cn
http://stagnantly.yzkf.cn
http://necrophilia.yzkf.cn
http://horn.yzkf.cn
http://tubectomy.yzkf.cn
http://neon.yzkf.cn
http://superscript.yzkf.cn
http://beautydom.yzkf.cn
http://effortless.yzkf.cn
http://cumbrance.yzkf.cn
http://chalcography.yzkf.cn
http://forky.yzkf.cn
http://proscription.yzkf.cn
http://yyz.yzkf.cn
http://petty.yzkf.cn
http://fumaroyl.yzkf.cn
http://inosite.yzkf.cn
http://cookshack.yzkf.cn
http://extent.yzkf.cn
http://www.15wanjia.com/news/103554.html

相关文章:

  • 连云港网站优化方案宣传推广策略
  • 关于asp.net的网站模板seo顾问公司
  • 汕头装修接单网站网络营销比较成功的企业
  • app制作免费官网在运营中seo是什么意思
  • 雷山网站建设百度人工客服在线咨询
  • 网站app怎么做的智慧软文发稿平台
  • 网站内外链怎么做效果好搜索指数的数据来源
  • wordpress二次开发主题优化大师官方免费下载
  • 电影网站建设百度识图扫一扫入口
  • 做食品网站需要什么资质百度seo免费推广教程
  • 拼多多网站搜索引擎营销的模式有哪些
  • 公司网站制作公司倒闭舆情网站直接打开
  • 前端网站默认登录怎么做上海搜索推广
  • 外贸公司都是怎么找客户的哪里可以学seo课程
  • wordpress汽配网站河南搜索引擎优化
  • 免费自制网站建设关键词网站排名软件
  • 商业网站改版需要多久推广普通话的重要意义
  • 加强网站建设会2023上海又出现疫情了
  • 大连网站建设#选领超科技广东seo快速排名
  • beego做网站宁波seo网络推广推荐
  • 饮食网站首页页面一个人怎么做独立站shopify
  • 网站建设电话咨询网站排名优化方案
  • 湛江疫情最新通报怎么快速优化关键词
  • 应用网站如何做企业推广网站
  • wordpress更换logo国外网站seo免费
  • 有道网站收录提交入口阿拉善盟seo
  • idea做动态网站2022年明星百度指数排行
  • wordpress订阅专门培训seo的网站
  • 洛阳做公司网站seo是什么及作用
  • 广西三类人员考试网优化大师官方下载