晓晨的博客

一个有梦想的程序猿!

设计模式(十七)状态模式

版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112

目录

导航

设计模式之六大设计原则
设计模式(一)单例模式
设计模式(二)工厂模式
设计模式(三)策略模式
设计模式(四)适配器模式
设计模式(五)享元模式
设计模式(六)建造者模式
设计模式(七)原型模式
设计模式(八)桥接模式
设计模式(九)外观模式
设计模式(十)组合模式
设计模式(十一)装饰器模式
设计模式(十二)代理模式
设计模式(十三)迭代器模式
设计模式(十四)观察者模式
设计模式(十五)中介者模式
设计模式(十六)命令模式
设计模式(十七)状态模式
设计模式(十八)访问者模式
设计模式(十九)责任链模式
设计模式(二十)解释器模式
设计模式(二十一)备忘录模式
设计模式(二十二)模板模式
设计模式总结篇(为什么要学习设计模式,学习设计模式的好处)

前言

状态模式:允许一个对象在其内部状态改变时改变它的行为,类的行为是基于它的状态改变的。状态模式是一种对象行为型模式。

抽象状态角色 (State):接口或抽象类,负责对象状态定义,并且封装环境角色以实现状态切换。

具体状态角色 (ConcreteState):具体状态类,实现了State中的抽象方法。

环境角色 (Context):定义客户端需要的接口,并且负责具体状态的切换。

例子

LZ已网页登陆为例子,当你浏览一个网页的时候,在你没登陆的时候是未登录状态,在你登陆以后是登陆状态,在这两种状态下,你想进入个人设置的页面的结果肯定是不一样的,这个例子用状态模式可以很好的解决。


/***
 *
 *@Author ChenjunWang
 *@Description:状态抽象类,列出受状态影响的方法
 *@Date: Created in 19:10 2018/4/15
 *@Modified By:
 *
 */
public abstract class State {

    abstract void settingProfile();
    abstract void viewIndex();
}

/***
 *
 *@Author ChenjunWang
 *@Description:登陆状态,实现登陆状态下的方法
 *@Date: Created in 19:16 2018/4/15
 *@Modified By:
 *
 */
public class LoginState extends State {
    @Override
    void settingProfile() {
        System.out.println("请设置信息!");
    }

    @Override
    void viewIndex() {

        System.out.println("欢迎进入主页!");
    }
}
/***
 *
 *@Author ChenjunWang
 *@Description:游客状态类,实现游客状态下的方法
 *@Date: Created in 19:20 2018/4/15
 *@Modified By:
 *
 */
public class TouristState extends State {

    @Override
    void settingProfile() {
        System.out.println("您未登陆,请先登陆!");

    }

    @Override
    void viewIndex() {

        System.out.println("欢迎进入主页!");
    }
}
/***
 *
 *@Author ChenjunWang
 *@Description:环境角色,定义用户所需要的接口,负责状态切换
 *@Date: Created in 19:10 2018/4/15
 *@Modified By:
 *
 */
public class Context {
    private State state;
    public static final State  LOGIN_STATE = new LoginState();
    public static final State  TOURIST_STATE = new TouristState();

    public void setState(State state) {
        this.state = state;
    }

    public void settingProfile(){
        state.settingProfile();
    }
    public void viewIndex(){
        state.viewIndex();
    }
}


/***
 *
 *@Author ChenjunWang
 *@Description:测试类
 *@Date: Created in 23:44 2018/4/14
 *@Modified By:
 *
 */
public class Test {


    public static void main(String[] args) {

        Context context = new Context();
        System.out.println("-----------------------一开始,游客状态,未登录-----------------------");
        context.setState(Context.TOURIST_STATE);
        context.viewIndex();
        context.settingProfile();
        System.out.println("-----------------------进入登陆页面,登陆后-----------------------");
        context.setState(Context.LOGIN_STATE);
        context.viewIndex();
        context.settingProfile();
    }

}

运行结构如下
-------------------------------------------------------------------------------
-----------------------一开始,游客状态,未登录-----------------------
欢迎进入主页!
您未登陆,请先登陆!
-----------------------进入登陆页面,登陆后-----------------------
欢迎进入主页!
请设置信息!

若不用状态模式,我们的代码可能是下面这样的。嗯……具体的例子就不写了,LZ相信大家看到下面的代码肯定有似曾相识的感觉。

if (state.equals("登陆")){
    做登陆逻辑
} else {
    做没登陆的逻辑
}

使用状态模式可以让不同状态的代码解耦,不会杂糅在一起,无论增删改都得动逻辑的类。

总结

优点

(1)避免了过多的swith…case 或者if..else 语句的使用
(2)使用体现了开闭原则和单一职责原则,每个状态都是一个子类,你要增加状态那就增加子类。

缺点

(1)假如状态很多,那你的类的数量将会膨胀。

Git地址

本篇实例Github地址:https://github.com/stackisok/Design-Pattern/tree/master/src/state

回到最上方


有什么不懂或者不对的地方,欢迎留言。
喜欢LZ文章的小伙伴们,可以关注一波,也可以留言,LZ会回你们的。
觉得写得不错的小伙伴,欢迎转载,但请附上原文地址,谢谢^_^!

阅读更多

扫码向博主提问

去开通我的Chat快问

晓_晨

正在通往架构师的路上……
  • 擅长领域:
  • Java
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/niunai112/article/details/79952625
个人分类: JAVA设计模式
所属专栏: java设计模式
上一篇设计模式(十六)命令模式
下一篇设计模式(十八)访问者模式
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭