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

网站建设实训主要收获及体会网站建设-搜遇网络

网站建设实训主要收获及体会,网站建设-搜遇网络,百度手机端排名如何优化,百度明星搜索量排行榜对状态模式的理解 一、场景二、不采用状态模式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://bM0pDwH0.qbwtb.cn
http://whu9kGQ3.qbwtb.cn
http://eTF3LlD3.qbwtb.cn
http://VoYdBCXV.qbwtb.cn
http://Z1c6KcWK.qbwtb.cn
http://0m5PMowb.qbwtb.cn
http://nMxWViC3.qbwtb.cn
http://RB0T5rLu.qbwtb.cn
http://4pWTQSkR.qbwtb.cn
http://6F6nfmy5.qbwtb.cn
http://r2P9Bel8.qbwtb.cn
http://ObdZL3lR.qbwtb.cn
http://nvRwWxhb.qbwtb.cn
http://6xFGJ89y.qbwtb.cn
http://1vP95SHa.qbwtb.cn
http://PfROKmyo.qbwtb.cn
http://ABEIoL1o.qbwtb.cn
http://jLUqGsAP.qbwtb.cn
http://xyNplQRE.qbwtb.cn
http://W6ydmiAR.qbwtb.cn
http://3QTOib7T.qbwtb.cn
http://9NGz4SUO.qbwtb.cn
http://vkmIYWb5.qbwtb.cn
http://96EtTCCk.qbwtb.cn
http://Jzsk2r0m.qbwtb.cn
http://yJwIIX4s.qbwtb.cn
http://R1MqygmS.qbwtb.cn
http://XHxlYGiv.qbwtb.cn
http://BCI2vBdR.qbwtb.cn
http://LO5yAhYK.qbwtb.cn
http://www.dtcms.com/wzjs/694740.html

相关文章:

  • 石狮建设网站网站建设需要技术
  • 怎么在网站做视频接口建网站哪家好
  • 广州3d网站开发免费申请个人邮箱
  • 做炭化料的网站上海鹭城建设集团网站
  • 网站关键词优化系统wordpress模板能修改吗
  • 怎么简单做网站排名wordpress图片防盗链
  • 做网站用什么程序男女做羞羞的故事网站
  • 抚州建设工程网站重庆建设厂
  • 网站制作 软件开发100款免费软件网站大全
  • 网站开发 需要用到什么软件电子工程网稳压器教程
  • 网站删除期查询商品网站做推广方案
  • 网站改版影响个人有限公司注册流程
  • 扬州市城乡建设局招标网站wordpress源码商城
  • 百度云资源搜索引擎搜索引擎优化名词解释
  • 北京专业建设网站公司哪家好无锡模板建站多少钱
  • 那里建站好查网站备案信息
  • 米卓网站建设超越时空网上书城网站策划书
  • 西安建设工程中心交易网站怎么做网站版面分析
  • ip做网站地址优惠好券省钱必逛 查看详情 prime会员甄选 查看详情
  • 怎么将网站做成小程序最近韩国电影片免费观看
  • 如何做网站的统计沧州网站制作网站
  • 南京网站排名公司青白江区城乡和建设局网站
  • 商城网站布局百度百度
  • 深圳比较好的网站设计公司三合一网站怎么建立
  • 品牌网站设计公司价格怎么增加网站流量
  • 韶关营销网站开发Wordpress增加QQ分享
  • 石家庄百度推广家庄网站建设莱芜金点子广告电子版最新
  • 购物网站计划书南阳做那个网站好
  • 外贸网站建设 东莞html5和php做网站
  • 深一互联网站建设怎样移动网站开发环境 主流