JAVA设计模式之【状态模式】
状态模式
水、固态、气态、液态
账户、正常状态、透支状态、受限状态
状态模式中,用一个状态类来分散冗长的条件语句,让系统有灵活性和可扩展性
状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题
角色
环境类Context
拥有多种状态的对象
抽象状态类State
定义一个接口来封装与环境类的一个特定状态相关的行为,相同的方法写在抽象状态类中
具体状态类ConcreteState
实现与环境类的一个状态相关的行为
状态转换方式
由环境类来充当状态管理器角色
由具体状态类来负责状态之间的转换
看例子
1.环境类,注册用户
package State;
/**
* Created by Jiqing on 2016/10/29.
*/
public class ForumAccount {
private AbstractState state;
private String name;
public ForumAccount(String name)
{
this.name=name;
this.state=new PrimaryState(this);
System.out.println(this.name + "注册成功!");
System.out.println("---------------------------------------------");
}
public void setState(AbstractState state)
{
this.state=state;
}
public AbstractState getState()
{
return this.state;
}
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return this.name;
}
public void downloadFile(int score)
{
state.downloadFile(score);
}
public void writeNote(int score)
{
state.writeNote(score);
}
public void replyNote(int score)
{
state.replyNote(score);
}
}
2.抽象状态类
package State;
/**
* Created by Jiqing on 2016/10/29.
*/
public abstract class AbstractState
{
protected ForumAccount acc;
protected int point;
protected String stateName;
public abstract void checkState(int score);
public void downloadFile(int score)
{
System.out.println(acc.getName() + "下载文件,扣除" + score + "积分。");
this.point-=score;
checkState(score);
System.out.println("剩余积分为:" + this.point + ",当前级别为:" + acc.getState().stateName + "。");
}
public void writeNote(int score)
{
System.out.println(acc.getName() + "发布留言" + ",增加" + score + "积分。");
this.point+=score;
checkState(score);
System.out.println("剩余积分为:" + this.point + ",当前级别为:" + acc.getState().stateName + "。");
}
public void replyNote(int score)
{
System.out.println(acc.getName() + "回复留言,增加" + score + "积分。");
this.point+=score;
checkState(score);
System.out.println("剩余积分为:" + this.point + ",当前级别为:" + acc.getState().stateName + "。");
}
public void setPoint(int point) {
this.point = point;
}
public int getPoint() {
return (this.point);
}
public void setStateName(String stateName) {
this.stateName = stateName;
}
public String getStateName() {
return (this.stateName);
}
}
3.具体状态类
package State;
/**
* Created by Jiqing on 2016/10/29.
*/
public class HighState extends AbstractState
{
public HighState(AbstractState state)
{
this.acc=state.acc;
this.point=state.getPoint();
this.stateName="专家";
}
public void writeNote(int score)
{
System.out.println(acc.getName() + "发布留言" + ",增加" + score + "*2个积分。");
this.point+=score*2;
checkState(score);
System.out.println("剩余积分为:" + this.point + ",当前级别为:" + acc.getState().stateName + "。");
}
public void downloadFile(int score)
{
System.out.println(acc.getName() + "下载文件,扣除" + score + "/2积分。");
this.point-=score/2;
checkState(score);
System.out.println("剩余积分为:" + this.point + ",当前级别为:" + acc.getState().stateName + "。"); }
public void checkState(int score)
{
if(point<0)
{
System.out.println("余额不足,文件下载失败!");
this.point+=score;
}
else if(point<=100)
{
acc.setState(new PrimaryState(this));
}
else if(point<=1000)
{
acc.setState(new MiddleState(this));
}
}
}
package State;
/**
* Created by Jiqing on 2016/10/29.
*/
public class MiddleState extends AbstractState
{
public MiddleState(AbstractState state)
{
this.acc=state.acc;
this.point=state.getPoint();
this.stateName="高手";
}
public void writeNote(int score)
{
System.out.println(acc.getName() + "发布留言" + ",增加" + score + "*2个积分。");
this.point+=score*2;
checkState(score);
System.out.println("剩余积分为:" + this.point + ",当前级别为:" + acc.getState().stateName + "。");
}
public void checkState(int score)
{
if(point>=1000)
{
acc.setState(new HighState(this));
}
else if(point<0)
{
System.out.println("余额不足,文件下载失败!");
this.point+=score;
}
else if(point<=100)
{
acc.setState(new PrimaryState(this));
}
}
}
package State;
/**
* Created by Jiqing on 2016/10/29.
*/
public class PrimaryState extends AbstractState{
public PrimaryState(AbstractState state)
{
this.acc=state.acc;
this.point=state.getPoint();
this.stateName="新手";
}
public PrimaryState(ForumAccount acc)
{
this.point=0;
this.acc=acc;
this.stateName="新手";
}
public void downloadFile(int score)
{
System.out.println("对不起," + acc.getName() + ",您没有下载文件的权限!");
}
public void checkState(int score)
{
if(point>=1000)
{
acc.setState(new HighState(this));
}
else if(point>=100)
{
acc.setState(new MiddleState(this));
}
}
}
4.客户端执行
package State;
/**
* Created by Jiqing on 2016/10/29.
*/
public class Client
{
public static void main(String args[])
{
ForumAccount account=new ForumAccount("张三");
account.writeNote(20);
System.out.println("--------------------------------------");
account.downloadFile(20);
System.out.println("--------------------------------------");
account.replyNote(100);
System.out.println("--------------------------------------");
account.writeNote(40);
System.out.println("--------------------------------------");
account.downloadFile(80);
System.out.println("--------------------------------------");
account.downloadFile(150);
System.out.println("--------------------------------------");
account.writeNote(1000);
System.out.println("--------------------------------------");
account.downloadFile(80);
System.out.println("--------------------------------------");
}
}
执行结果:
张三注册成功!
---------------------------------------------
张三发布留言,增加20积分。
剩余积分为:20,当前级别为:新手。
--------------------------------------
对不起,张三,您没有下载文件的权限!
--------------------------------------
张三回复留言,增加100积分。
剩余积分为:120,当前级别为:高手。
--------------------------------------
张三发布留言,增加40*2个积分。
剩余积分为:200,当前级别为:高手。
--------------------------------------
张三下载文件,扣除80积分。
剩余积分为:120,当前级别为:高手。
--------------------------------------
张三下载文件,扣除150积分。
余额不足,文件下载失败!
剩余积分为:120,当前级别为:高手。
--------------------------------------
张三发布留言,增加1000*2个积分。
剩余积分为:2120,当前级别为:专家。
--------------------------------------
张三下载文件,扣除80/2积分。
剩余积分为:2080,当前级别为:专家。
--------------------------------------
看关系图

JAVA设计模式之【状态模式】的更多相关文章
- 折腾Java设计模式之状态模式
原文地址 折腾Java设计模式之状态模式 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.在状态模式中,我们创建表示各种状态的对象 ...
- JAVA设计模式--State(状态模式)
状态模式(State Pattern)是设计模式的一种,属于行为模式. 定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要 ...
- JAVA设计模式:状态模式
声明:转载请说明来源:http://www.cnblogs.com/pony1223/p/7518226.html 一.引出状态模式 假设我们现在有一个糖果机项目,那么我们知道正常一般糖果机提供给用户 ...
- Java设计模式之状态模式详解
(本文由言念小文原创,转载请注明出处) 在实际工作中经常遇到某个对象,处于不同的状态有不同行为逻辑.且状态之间可以相互迁移的业务场景,特别是在开发通信协议栈类软件中尤为多见.<设计模式之禅> ...
- java设计模式之状态模式
状态模式 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类. 状态模式UML图 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关 ...
- 曾侯乙编钟引发的遐想之Java设计模式:状态模式
目录 示例 简单例子 改进代码 状态模式 定义 意图 主要解决问题 何时使用 优缺点 曾侯乙编钟 状态模式-命令模式-策略模式 示例 一个类对外提供了多个行为,同时该类对象有多种状态,不同状态下对外的 ...
- 折腾Java设计模式之备忘录模式
原文地址:折腾Java设计模式之备忘录模式 备忘录模式 Without violating encapsulation, capture and externalize an object's int ...
- 折腾Java设计模式之访问者模式
博客原文地址:折腾Java设计模式之访问者模式 访问者模式 Represent an operation to be performed on the elements of an object st ...
- 折腾Java设计模式之命令模式
博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ...
- JAVA 设计模式之原型模式
目录 JAVA 设计模式之原型模式 简介 Java实现 1.浅拷贝 2.深拷贝 优缺点说明 1.优点 2.缺点 JAVA 设计模式之原型模式 简介 原型模式是六种创建型设计模式之一,主要应用于创建相同 ...
随机推荐
- Swift - 判断是否有某功能访问权限,没有则提示,并自动跳转到设置页
由于 iOS 系统的安全限制,App 如果需要访问设备的通讯录.麦克风. 相册. 相机.地理位置等时,需要请求用户是否允许访问. 有时用户不小心点了“不允许”,后面可能就不知道要去哪里再开启这个权 ...
- php中的self关键字和this关键字的区别和联系
php中的self关键字和this关键字的区别和联系 面向对象编程(OOP,Object OrientedProgramming)现已经成为编程人员的一项基本技能.利用OOP的思想进行PHP的高级编程 ...
- NPAPI——实现非IE浏览器的类似ActiveX的本地程序(插件)调用
一.Netscape Plugin Interface(NPAPI) 大致的说明可以看下官方文档Plugin 本文主要针对于JavaScript与插件交互部分做一些交流,比如用于数字证书的操作(淘宝和 ...
- Windows下慎用内核隔离
1. 开启内核隔离后只能通过注册表关闭 2. 开启内核隔离后, 默认会启动hybrid-v, 这个东西和虚拟机是冲突的, 这样就用不了虚拟机了. 3. 解决方法: 关闭内核隔离后, 再关闭已经 ...
- ubuntu sublime text 2 破解版
原网地址 : http://blog.csdn.net/icephone/article/details/8217567 关于sublime text 2 的一个使用教程以及前端的不错的学习博客 ht ...
- QT-解除connect
前言:解除关联. 一.新建工程 二.新建部件 在ui设计界面拖入一个line edit,一个label以及两个button按钮 右键“关联”按钮转到槽,选择clicked(),添加如下代码: void ...
- spring《四》自动装配
byName模式<bean autowire="byName"> Spring会查找一个叫做date的bean定义. byType模式<bean autowire ...
- C# 特性(Attribute)
C# 特性(Attribute) 特性(Attribute)是用于在运行时传递程序中各种元素(比如类.方法.结构.枚举.组件等)的行为信息的声明性标签.您可以通过使用特性向程序添加声明性信息.一个声明 ...
- 前端将图片二进制流显示在html端
工作中碰到的问题,在处理接口返回的验证码图片时,由于返回的是encode编码代码,在js端获取到数据之后,通过函数encodeURI()来进行解码,之后可以通过在src中设置来实现图片显示:
- 使用pgpool管理数据库集群故障的问题
pgpool如何选举master角色 在pgpool启动的过程中通过对 pgpoo.conf配置文件中的数据库节点条目信息,对集群中的数据库节点从0开始一个个的遍历,并发送SQL语句“select p ...