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

普洱茶网站建设wordpress只索引分类

普洱茶网站建设,wordpress只索引分类,在盐城做网站的网络公司电话,网页制作三剑客软件对状态模式的理解 一、场景二、不采用状态模式1、代码2、缺点 三、采用状态模式1、代码1.1 状态类1.2 上下文(这里指:媒体播放器)1.3 客户端 2、优点 一、场景 同一个东西(例如:媒体播放器),有一…

对状态模式的理解

    • 一、场景
    • 二、不采用状态模式
      • 1、代码
      • 2、缺点
    • 三、采用状态模式
      • 1、代码
        • 1.1 状态类
        • 1.2 上下文(这里指:媒体播放器)
        • 1.3 客户端
      • 2、优点

一、场景

  • 同一个东西(例如:媒体播放器),有一些操作:暂停、播放、停止。很显然,每执行一种操作,媒体播放器的状态便改变了。

    • 播放 -> 暂停:

      • Media Player is now paused.

      当前是播放状态,点击暂停操作,输出:Media Player is not playing.

    • 暂停 -> 暂停

      • Media Player is not playing.

      当前是暂停状态,点击暂停操作,输出:Media Player is not playing.

    • 虽然是同一种操作,但是,因为媒体播放器处在不同的状态,所以表现不同。

  • 面对这种场景,我们怎么编码呢?

    • 简单粗暴的方式:写if-else或者switch。(详见:二、不采用状态模式)

    • 更好的方式:采用状态模式。(详见:三、采用状态模式)

      • 状态模式是一种行为设计模式, 让我们能在一个对象的内部状态变化时改变其行为。

二、不采用状态模式

1、代码

// 媒体播放器
public class MediaPlayer {private String currentState;public MediaPlayer() {this.currentState = "STOPPED"; // 初始状态为停止}public void play() {if (currentState.equals("STOPPED")) {System.out.println("Media Player is now playing.");currentState = "PLAYING";} else if (currentState.equals("PAUSED")) {System.out.println("Media Player resumed playing.");currentState = "PLAYING";} else {System.out.println("Media Player is already playing.");}}public void pause() {if (currentState.equals("PLAYING")) {System.out.println("Media Player is now paused.");currentState = "PAUSED";} else {System.out.println("Media Player is not playing.");}}public void stop() {System.out.println("Media Player is now stopped.");currentState = "STOPPED";}
}// 客户端
public class Main {public static void main(String[] args) {MediaPlayer mediaPlayer = new MediaPlayer();System.out.println("Initial state: Stopped");mediaPlayer.play(); // Stopped -> PlayingmediaPlayer.pause(); // Playing -> PausedmediaPlayer.play(); // Paused -> PlayingmediaPlayer.stop(); // Playing -> Stopped}
}/*
Initial state: Stopped
Media Player is now playing.
Media Player is now paused.
Media Player resumed playing.
Media Player is now stopped.
*/

2、缺点

  • 由于在设计之初,不一定能想到所有状态,假设一开始只想到了:play、pause、stop。辛辛苦苦写好了上面的代码。这时候,产品经理又提了新需求了,发现又要补2个状态。没办法,上面的play、pause、stop三个方法都要进行修改。改着改着就成屎山了。

三、采用状态模式

1、代码

1.1 状态类
  • 状态模式建议为对象的所有可能状态新建一个类, 每个状态独自实现自身状态下的各个行为。
// 抽象父类
public abstract class MediaPlayerState {protected MediaPlayer mediaPlayer;public MediaPlayerState(MediaPlayer mediaPlayer) {this.mediaPlayer = mediaPlayer;}protected abstract void play();protected abstract void pause();protected abstract void stop();
}// 播放状态
public class MediaPlayerPlayState extends MediaPlayerState {public MediaPlayerPlayState(MediaPlayer mediaPlayer) {super(mediaPlayer);}@Overridepublic void play() {System.out.println("Media Player is already playing.");mediaPlayer.setState(this);}@Overridepublic void pause() {System.out.println("Media Player is now paused.");mediaPlayer.setState(new MediaPlayerPauseState(mediaPlayer));}@Overridepublic void stop() {System.out.println("Media Player is now stopped.");mediaPlayer.setState(new MediaPlayerStopState(mediaPlayer));}
}// 暂停状态
public class MediaPlayerPauseState extends MediaPlayerState {public MediaPlayerPauseState(MediaPlayer mediaPlayer) {super(mediaPlayer);}@Overridepublic void play() {System.out.println("Media Player resumed playing.");mediaPlayer.setState(new MediaPlayerPlayState(mediaPlayer));}@Overridepublic void pause() {System.out.println("Media Player is not playing.");mediaPlayer.setState(this);}@Overridepublic void stop() {System.out.println("Media Player is now stopped.");mediaPlayer.setState(new MediaPlayerStopState(mediaPlayer));}
}// 停止状态
public class MediaPlayerStopState extends MediaPlayerState {public MediaPlayerStopState(MediaPlayer mediaPlayer) {super(mediaPlayer);}@Overridepublic void play() {System.out.println("Media Player is now playing.");mediaPlayer.setState(new MediaPlayerPlayState(mediaPlayer));}@Overridepublic void pause() {System.out.println("Media Player is not playing.");mediaPlayer.setState(new MediaPlayerPauseState(mediaPlayer));}@Overridepublic void stop() {System.out.println("Media Player is now stopped.");mediaPlayer.setState(this);}
}
1.2 上下文(这里指:媒体播放器)
public class MediaPlayer {private MediaPlayerState state;public void setState(MediaPlayerState state) {this.state = state;}public MediaPlayer() {this.state = new MediaPlayerStopState(this);}public void play() {state.play();}public void pause() {state.pause();}public void stop() {state.stop();}
}
1.3 客户端
public class Main {public static void main(String[] args) {MediaPlayer mediaPlayer = new MediaPlayer();System.out.println("Initial state: Stopped");mediaPlayer.play(); // Stopped -> PlayingmediaPlayer.pause(); // Playing -> PausedmediaPlayer.play(); // Paused -> PlayingmediaPlayer.stop(); // Playing -> Stopped}
}/*
Initial state: Stopped
Media Player is now playing.
Media Player is now paused.
Media Player resumed playing.
Media Player is now stopped.
*/

2、优点

  • 每个状态类,只需要关心自己状态下,每种操作应该执行哪些逻辑就好了。
  • 如果新增了状态,那无非就是新增一个类,其他已有的状态类,无非就是新写一个方法。这并不会去修改已有的代码,符合开闭原则。

上面的写法有一个小瑕疵,每个状态类实际上应该是单例模式(详见:对单例模式的饿汉式、懒汉式的思考),而不是每次切换状态的时候新建一个对象。

  • 不同状态下,有些操作是一样的,例如:停止操作。这时候可以采用组合的方式进行复用。将停止操作放到一个类中,例如:MediaPlayerStopHandler。每个方法调用MediaPlayerStopHandler的stop方法()实现停止。

  • 仔细看下状态模式的结构:​

    image

    • 会发现和策略模式的结构很像。但二者有很多不同:

      • (1)策略模式:

        • 1)根据客户端的输入,匹配一种策略。每个策略完全独立,策略A感知不到策略B。
        • 2)策略A和策略B是做同一件事情,仅仅是做法不同。
      • (2)状态模式:

        • 1)每种状态下,会有多种行为。(如果只有一种行为,也不存在状态转换了)
        • 2)状态A和状态B不是完全独立的,状态A执行某个行为后,会从状态A转移到状态B。


文章转载自:

http://qsaKbNuS.jzgxp.cn
http://WEvYXlSG.jzgxp.cn
http://rlKFGylK.jzgxp.cn
http://H3V0ygcE.jzgxp.cn
http://4kpvALCh.jzgxp.cn
http://kVz8VodK.jzgxp.cn
http://zLzWZ0J5.jzgxp.cn
http://J4oW8bKQ.jzgxp.cn
http://JrSsswLu.jzgxp.cn
http://5ymZsE7X.jzgxp.cn
http://kQELCcIX.jzgxp.cn
http://Ny8qmxYE.jzgxp.cn
http://de7BMFwd.jzgxp.cn
http://kaqZQs9w.jzgxp.cn
http://XNlzp7oI.jzgxp.cn
http://0SiGkHqu.jzgxp.cn
http://YPaqROtn.jzgxp.cn
http://zmQcau0Q.jzgxp.cn
http://xT80Kejm.jzgxp.cn
http://e1XAXPQo.jzgxp.cn
http://C96YnzHV.jzgxp.cn
http://xZ96EfAi.jzgxp.cn
http://G9At9nQo.jzgxp.cn
http://mhmeP2Qh.jzgxp.cn
http://5jYawxlK.jzgxp.cn
http://FyYxfNEO.jzgxp.cn
http://CCyvXxzz.jzgxp.cn
http://LFNksMZr.jzgxp.cn
http://Fi9ecb3S.jzgxp.cn
http://dBaMup40.jzgxp.cn
http://www.dtcms.com/wzjs/742113.html

相关文章:

  • 做搜索引擎的网站秦皇岛建设局长
  • 图书管理系统网站开发教程网站开发文档步骤应该怎么写
  • 网站推广计划效果网站权重排行
  • 区总工会网站建设流程查看别人wordpress主题
  • 自己做网站怎么赢利网站上人家做的简历
  • 厦门手机网站建设潍坊方圆网站建设
  • 网站后台数据分析怎么做深圳市龙华区民治街道
  • 韩国原生ip站群服务器网站建设个人简历的网页
  • 新乡手机网站建设哪家专业营销型网站费用
  • html网站支付链接怎么做的商河县做网站公司
  • 做推广网站那里好呼叫中心系统平台
  • 网站建设 试卷上海网站开发工程师
  • 企业黄页网站源码网页版qq登录入口手机版
  • 网站没询盘怎么做推广网站被k原因
  • 响应式网站设计工具建设服装网站的亮点
  • 做外贸进大公司网站用ps做美食网站
  • 做网站如何更新百度快照网站制作方案
  • 微网站功能列表手机网站建设图
  • 海口网站建设搜q479185700博学云网站建设
  • 外语不精通可以做国外网站吗做系统网站赚钱
  • 正规的网站制作哪个好仿珠宝首饰网站开发
  • 网站图片有什么要求吗高端办公室装修公司
  • 如何搭建一个简单的网站做网站容易学吗
  • 网站优化的作用免费永久个人服务器
  • 做网站资源推荐写代码建商城网站时间
  • 网站手机端排名怎么做旅游网站设计说明
  • 2019怎么做网站赚钱大前端dux主题wordpress
  • 济南做网站创意秦皇岛市第一中学
  • 东莞网站设计知名 乐云践新小说抄写员兼职
  • 可信网站认证服务商做头像的网站有哪些