状态模式(行为型)
2016-06-16 00:08
204 查看
状态模式(State Pattern) 又称为状态对象模式,该模式允许一个对象在其内部状态改变时改变其行为.
设计场景:
你看电视机时需要频繁变更不同频道,如何设计?
此时有三个对象: 人Person,电视机TV,频道Channel.
我们只能调用TV对象的public方法来切换不同的频道,比如调用TV对象的toCCTV1()方法切换到cctv1;
代码实现时你会想直接在TV对象的每一个换频道方法中new出不同的频道对象,比如在toCCTV1()方法内部new出CCTV1对象然后调用该对象的display()方法即可.
很好(应该不会有人想直接换电视机对象的吧).
但是切换频道时不用给频道对象传参数,可重用频道对象,所以我们在TV类中保存静态的不同频道对象的引用,然后调用它的display方法;
这就是状态模式啦,简单吧.
又到了贴代码的时间:
Person类:
TV电视机类:
Channel频道接口:
CCTV1类:
CCTV2类:
CCTV3类:
说下状态模式与其他模式的区别:
状态state模式VS外观Facade模式:状态模式隐藏的是同一类事物的操作,如频道切换(大同小异).但外观模式隐藏的是不同类型的对象操作,比如老板交代秘书自己要去餐厅吃饭,那么秘书必须内部调用司机对象开车,秘书自己还要打电话去预定座位等操作
状态state模式VS工厂Factory模式:状态模式隐藏的是同一大类事物的操作,如频道切换,但工厂模式只是负责生产对象,至于对象干嘛用并不知情.
状态state模式VS享元模式:依旧,状态模式只隐藏程序内部调用的细节,而享元模式只是负责对象的重用.
状态模式VS策略模式:两个模式很像,但是状态模式因为对象内部状态改变了才导致不同的行为,不同的状态对象内部封装了该状态所对应的所有操作;而策略模式出现不同行为并不是因为对象内部状态改变,而是对象构造出来之后就已经决定了它所具有的行为;
状态模式使用场景:
1. 对象的行为依赖于它所处的状态,即行为随状态改变而改变的场景;
2. 对象在某个方法里依赖于一重或多重条件分支语句,此时可以使用状态模式将分支语句中的每一个分支都包装到一个独立的类中,使得这些条件语句能够以类的方式独立存在和演化.如此,维护这些独立的类就不再影响到系统的其他部分了.
设计场景:
你看电视机时需要频繁变更不同频道,如何设计?
此时有三个对象: 人Person,电视机TV,频道Channel.
我们只能调用TV对象的public方法来切换不同的频道,比如调用TV对象的toCCTV1()方法切换到cctv1;
代码实现时你会想直接在TV对象的每一个换频道方法中new出不同的频道对象,比如在toCCTV1()方法内部new出CCTV1对象然后调用该对象的display()方法即可.
很好(应该不会有人想直接换电视机对象的吧).
但是切换频道时不用给频道对象传参数,可重用频道对象,所以我们在TV类中保存静态的不同频道对象的引用,然后调用它的display方法;
这就是状态模式啦,简单吧.
又到了贴代码的时间:
Person类:
package com.shusheng.pattern.state; public class Person { public static void main(String[] args) { TV tv = new TV(); //哈哈,我不管,我只会控制电视机看不同频道 tv.toCCTV1(); tv.toCCTV2(); tv.toCCTV3(); } }
TV电视机类:
package com.shusheng.pattern.state; public class TV { private static final Channel CCTV1 = new CCTV1(); private static final Channel CCTV2 = new CCTV2(); private static final Channel CCTV3 = new CCTV3(); private Channel currentChannel ;//表示当前所收看的频道,当需要向外面提供当前频道的信息的使用需要用到 public void toCCTV1() { this.currentChannel = CCTV1;//只是简单转了一下 currentChannel.display(); } public void toCCTV2() { this.currentChannel = CCTV2;//只是简单转了一手 currentChannel.display(); } public void toCCTV3() { this.currentChannel = CCTV3;//只是简单转了一手 currentChannel.display(); } }
Channel频道接口:
package com.shusheng.pattern.state; public interface Channel { public void display(); }
CCTV1类:
package com.shusheng.pattern.state; public class CCTV1 implements Channel { @Override public void display() { System.out.println("开始观看cctv1"); } }
CCTV2类:
package com.shusheng.pattern.state; public class CCTV2 implements Channel { @Override public void display() { System.out.println("开始观看cctv2"); } }
CCTV3类:
package com.shusheng.pattern.state; public class CCTV3 implements Channel { @Override public void display() { System.out.println("开始观看cctv3"); } }
说下状态模式与其他模式的区别:
状态state模式VS外观Facade模式:状态模式隐藏的是同一类事物的操作,如频道切换(大同小异).但外观模式隐藏的是不同类型的对象操作,比如老板交代秘书自己要去餐厅吃饭,那么秘书必须内部调用司机对象开车,秘书自己还要打电话去预定座位等操作
状态state模式VS工厂Factory模式:状态模式隐藏的是同一大类事物的操作,如频道切换,但工厂模式只是负责生产对象,至于对象干嘛用并不知情.
状态state模式VS享元模式:依旧,状态模式只隐藏程序内部调用的细节,而享元模式只是负责对象的重用.
状态模式VS策略模式:两个模式很像,但是状态模式因为对象内部状态改变了才导致不同的行为,不同的状态对象内部封装了该状态所对应的所有操作;而策略模式出现不同行为并不是因为对象内部状态改变,而是对象构造出来之后就已经决定了它所具有的行为;
状态模式使用场景:
1. 对象的行为依赖于它所处的状态,即行为随状态改变而改变的场景;
2. 对象在某个方法里依赖于一重或多重条件分支语句,此时可以使用状态模式将分支语句中的每一个分支都包装到一个独立的类中,使得这些条件语句能够以类的方式独立存在和演化.如此,维护这些独立的类就不再影响到系统的其他部分了.
相关文章推荐
- 二、设计模式——状态模式
- 详解state状态模式及在C++设计模式编程中的使用实例
- C# 设计模式系列教程-状态模式
- 实例讲解jQuery EasyUI tree中state属性慎用
- ASP.NET State service状态服务的问题解决方法
- 解析C++编程中如何使用设计模式中的状态模式结构
- 详解PHP中的状态模式编程
- C++设计模式之状态模式
- 学习JavaScript设计模式之状态模式
- 深入理解JavaScript系列(43):设计模式之状态模式详解
- 对比Java设计模式编程中的状态模式和策略模式
- Java设计模式之状态模式(State模式)介绍
- 实例讲解jQuery EasyUI tree中state属性慎用
- shell之打印数组的键与值及常用查询脚本
- 电脑端口
- flex4里的state
- Services and State with Ambari REST API
- Monad State in Haskell 笔记
- Android之drawable state各个属性详解
- saltstack state模块-状态管理