IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> js设计模式-状态模式-示例(高压锅状态) -> 正文阅读

[JavaScript知识库]js设计模式-状态模式-示例(高压锅状态)

?

<template>
  <div class="cooker">
    <img src="../assets/gaoyaguo.png" alt="." />
    <div class="flex typeName">
      <div>状态:{{ typeName }}</div>
      <div>描述:{{ desction }}</div>
    </div>
    <div class="flex buttonSubmit">
      <div @click="powerOn">接电</div>
      <div @click="powerOff">断电</div>
      <div @click="startCook">开始煮饭</div>
      <div @click="open">开盖</div>
      <div @click="close">盖上</div>
    </div>
  </div>
</template>

<script>
import Cooker from "./cookerData.js";

const CookerCent = new Cooker();
export default {
  data() {
    return {
      typeName: "~",
      desction: "~",
    };
  },
  mounted() {},
  methods: {
    powerOn() {
      CookerCent.changeSwitch('powerOn');
      this.desction = CookerCent.getTypeName();
      this.typeName = CookerCent.getDesction();
    },
    powerOff() {
      CookerCent.changeSwitch('powerOff');
      this.desction = CookerCent.getTypeName();
      this.typeName = CookerCent.getDesction();
    },
    startCook() {
      CookerCent.changeSwitch('startCook');
      this.desction = CookerCent.getTypeName();
      this.typeName = CookerCent.getDesction();
    },
    open() {
      CookerCent.changeSwitch('open');
      this.desction = CookerCent.getTypeName();
      this.typeName = CookerCent.getDesction();
    },
    close() {
      CookerCent.changeSwitch('close');
      this.desction = CookerCent.getTypeName();
      this.typeName = CookerCent.getDesction();
    },
  },
};
</script>

<style>
.flex {
  display: flex;
}
button {
  cursor: pointer;
}
.cooker{
  width: 500px;
  margin: 0 auto;
}
img{
  display: block;
  width: 300px;
  margin: 0 auto;
}
.typeName{
  width: 100%;
  justify-content: center;
  margin: 20px 0;
}
.typeName>div{
  width: 50%;
}
.typeName>div:nth-child(1){
  margin-right: 20px;
}
.buttonSubmit{
  width: 100%;
  justify-content: center;
}
.buttonSubmit>div{
  width:calc((100% - 30px)/4);
  margin-right: 10px;
  background-color: #ededed;
  border-radius: 5px;
  cursor: pointer;
  padding: 5px 0;
  text-align: center;
}
.buttonSubmit>div:last-child{
  margin-right: 0;
}
</style>

js

class Cooker {
    constructor() {      //  constructor 是状态变量、固定写法
        this.cookerType = new PowerOn(this)  // 默认状态 已接电  此时的 this 承接上下文 
    }
    changeSwitch(cookerType) {    // 外部调用下面5个类中的方法  默认当前是 已接电  PowerOn、所以点击外部任何按钮、都是调用这个类下面的函数、
        this.cookerType[cookerType]()
    }
    getTypeName() {
        return this.cookerType.typeName   //  这里的typeName 是下面5个类中的共有属性  this.cookerType 此时代表的就是当前点击时的类、比如默认实例化的类PowerOn、点击的任何函数都是这个类里面的
    }
    getDesction() {
        return this.cookerType.desction    //  同上
    }
}
class PowerOn {   // 当前类的状态是已接电、里面的5个函数分别做了处理、无法执行下一步的会提示文字、可以执行下一步的、实例化下一步的类
    constructor(cooker) {   //  构造函数传入的参数就是上面的this、可以理解为固定写法
        this.cooker = cooker     //  this.cooker 相当于 Cooker 里面的this 
    }
    powerOn() {
        this.typeName = '当前是接电状态'
        this.desction = '已接电'
    }
    powerOff() {
		this.cooker.cookerType = new PowerOff(this.cooker)     // 当前状态是已接电、这个函数是断电、点击后指向断电的类、之后操作和前面一样、在格子的类中处理各自的状态
    }
    startCook() {
		this.cooker.cookerType = new StartCook(this.cooker)
    }
    open() {
        this.typeName = '当前是接电状态'
        this.desction = '不能开盖、会爆炸'
    }
    close() {
        this.typeName = '当前状态-已接电'
        this.desction = '已经盖上了'
    }
}
class PowerOff {
    constructor(cooker) {
        this.cooker = cooker
        this.typeName = '当前状态-断电'
        this.desction = '已断电'
    }
    powerOn() {
        this.cooker.cookerType = new PowerOn(this.cooker)  
    }
    powerOff() {
        this.typeName = '当前状态-断电'
        this.desction = '已断电'
    }
    startCook() {
        this.typeName = '当前状态-断电'
        this.desction = '不能煮饭'
    }
    open() {
        this.typeName = '当前状态-断电'
        this.desction = '可以开盖'
    }
    close() {
        this.cooker.cookerType = new Close(this.cooker)
    }
}
class StartCook {
    constructor(cooker) {
        this.cooker = cooker
        this.typeName = '当前状态-煮饭'
        this.desction = '开始煮饭222'
    }
    powerOn() {
        this.typeName = '当前状态-煮饭'
        this.desction = '已接电'
    }
    powerOff() {
        this.cooker.cookerType = new PowerOff(this.cooker)
    }
    startCook() {
        this.typeName = '当前状态-煮饭'
        this.desction = '正在煮饭'
    }
    open() {
        this.typeName = '当前状态-煮饭'
        this.desction = '不能开盖、会爆炸'
    }
    close() {
        this.typeName = '当前状态-煮饭'
        this.desction = '已经盖上了'
    }
}
class Open {
    constructor(cooker) {
        this.cooker = cooker
        this.typeName = '当前状态-开盖'
        this.desction = ''
    }
    powerOn() {
        this.typeName = '当前状态-开盖'
        this.desction = '接电中、不能打开'
    }
    powerOff() {
        this.cooker.cookerType = new PowerOff(this.cooker)
    }
    startCook() {
        this.typeName = '当前状态-开盖'
        this.desction = '开盖中、不能煮饭'
    }
    open() {
        this.typeName = '当前状态-开盖'
        this.desction = '已开盖'
    }
    close() {
        this.cookerType = new Close(this.cooker)
    }
}
class Close {
    constructor(cooker) {
        this.cooker = cooker
        this.typeName = '当前状态-关盖'
        this.desction = ''
    }
    powerOn() {
        this.cooker.cookerType = new PowerOn(this.cooker)
    }
    powerOff() {
        this.cooker.cookerType = new PowerOff(this.cooker)
    }
    startCook() {
        this.cooker.cookerType = new StartCook(this.cooker)
    }
    open() {
        this.cooker.cookerType = new Open(this.cooker)
    }
    close() {
        this.typeName = '当前状态-关盖'
        this.desction = '已关盖'
    }
}
export default Cooker

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-13 21:41:13  更:2022-03-13 21:43:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:47:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码