状态设计模式
- 使用场景:
- 1、行为随状态改变而改变的场景(在游戏、GUI、设备控制、编译器等场景用的比较多)。
- 2、条件、分支语句的代替者。
- 注意事项:在行为受状态约束的时候使用状态模式,而且状态不超过 5 个。
用订单状态变化来举例:
`
/**
* @author
* 声明5种状态
*/
public interface IStateModel {
void unPay();
void pay();
void refund();
void confirm();
void update();
}
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.JLabel;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
/**
* @author jacktan
*
*/
public class StatePattern extends JFrame {
private JPanel contentPane;
private JButton btnPay;
private JButton btnRefund;
private JButton btnConfirm;
private JLabel labelState;
IStateModel state;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
StatePattern frame = new StatePattern();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public StatePattern() {
setTitle("\u72B6\u6001\u8BBE\u8BA1\u6A21\u5F0F");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 260, 131);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
btnPay = new JButton("\u4ED8\u6B3E");
btnPay.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
StatePattern.this.setState(new PayPattern());
}
});
btnRefund = new JButton("\u9000\u6B3E");
btnRefund.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
StatePattern.this.setState(new RefundPattern());
}
});
btnConfirm = new JButton("\u786E\u8BA4\u6536\u8D27");
btnConfirm.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
StatePattern.this.setState(new ConfirmPattern());
}
});
labelState = new JLabel("\u672A\u4ED8\u6B3E");
GroupLayout gl_contentPane = new GroupLayout(contentPane);
gl_contentPane.setHorizontalGroup(
gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createSequentialGroup()
.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING, false)
.addComponent(btnPay, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(btnConfirm, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGap(18)
.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING, false)
.addComponent(labelState, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(btnRefund, GroupLayout.DEFAULT_SIZE, 73, Short.MAX_VALUE))
.addContainerGap(62, Short.MAX_VALUE))
);
gl_contentPane.setVerticalGroup(
gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createSequentialGroup()
.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
.addComponent(btnPay)
.addComponent(btnRefund))
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
.addComponent(btnConfirm)
.addComponent(labelState))
.addContainerGap(30, Short.MAX_VALUE))
);
setState(new UnPay());
contentPane.setLayout(gl_contentPane);
}
public void setState(IStateModel state) {
this.state = state;
state.update();
}
class ConfirmPattern implements IStateModel {
@Override
public void pay() {
}
@Override
public void refund() {
}
@Override
public void confirm() {
StatePattern.this.setState(new UnPay());
}
@Override
public void update() {
StatePattern.this.btnRefund.setEnabled(false);
StatePattern.this.btnConfirm.setEnabled(false);
StatePattern.this.btnPay.setEnabled(true);
StatePattern.this.labelState.setText("已确认收货");
}
/* (non-Javadoc)
* @see 状态模式.IStateModel#unPay()
*/
@Override
public void unPay() {
}
}
class RefundPattern implements IStateModel {
@Override
public void pay() {
}
@Override
public void refund() {
StatePattern.this.setState(new UnPay());
}
@Override
public void confirm() {
}
@Override
public void update() {
StatePattern.this.btnRefund.setEnabled(false);
StatePattern.this.btnConfirm.setEnabled(false);
StatePattern.this.btnPay.setEnabled(true);
StatePattern.this.labelState.setText("已退款");
}
/* (non-Javadoc)
* @see 状态模式.IStateModel#unPay()
*/
@Override
public void unPay() {
}
}
class PayPattern implements IStateModel {
/* (non-Javadoc)
* @see 状态模式.IStateModel#unPay()
*/
@Override
public void unPay() {
}
/* (non-Javadoc)
* @see 状态模式.IStateModel#pay()
*/
@Override
public void pay() {
System.out.println("不能重复支付");
}
/* (non-Javadoc)
* @see 状态模式.IStateModel#refund()
*/
@Override
public void refund() {
}
/* (non-Javadoc)
* @see 状态模式.IStateModel#confirm()
*/
@Override
public void confirm() {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see 状态模式.IStateModel#update()
*/
@Override
public void update() {
StatePattern.this.btnRefund.setEnabled(true);
StatePattern.this.btnConfirm.setEnabled(true);
StatePattern.this.btnPay.setEnabled(false);
StatePattern.this.labelState.setText("已支付");
}
}
class UnPay implements IStateModel{
@Override
public void unPay() {
System.out.println("还未进行支付");
}
@Override
public void pay() {
StatePattern.this.setState(new PayPattern());
}
@Override
public void refund() {
System.out.println("还款进行支付,不能退款");
}
@Override
public void confirm() {
System.out.println("还款进行支付,不能确认收货");
}
@Override
public void update() {
StatePattern.this.btnRefund.setEnabled(false);
StatePattern.this.btnConfirm.setEnabled(false);
StatePattern.this.btnPay.setEnabled(true);
StatePattern.this.labelState.setText("未支付");
}
}
}
`
<!-- This document was created with MarkdownPad, the Markdown editor for Windows (http://markdownpad.com) -->
分享到:
相关推荐
1,状态模式允许一个"对象"在其内部状态改变的时候改变其行为。 2,状态模式的角色: 抽象状态,具体状态(一般是几个,每一个状态下有不同的行为,),环境(context)角色(就是对象,什么对象的状态,一般该对象要...
设计模式:状态模式TCPConnection案例,详细介绍可参考我的csdn博客。
状态模式与实时控制线程类连接起来,作了一个周期性执行任务。并按到指定的状态,周期有序地执行指定的任务。 本文主要讲解下状态模式的实现方法,首先对状态模式作下简单的定义:允许一个对象在其内部状态改变时...
java设计模式之状态模式入门
55-Java设计模式之策略模式与状态模式1
设计模式之状态模式实例,用Java实现,副讲解 设计模式之状态模式实例,用Java实现,副讲解 设计模式之状态模式实例,用Java实现,副讲解
能让你迅速理解和运用设计模式中的状态模式,进行编程
C++状态模式
java设计模式之状态模式,通过实际生活中的例子说明状态模式的原理。
设计模式C++学习之状态模式(State)
最近在学设计模式,使用状态模式去代替大量的if else 。比如登录。这个案例比较简单。默认不登录,登录之后可以点击转发。,通过替换状态进行判断
java设计模式之-状态模式-实现
分享关于状态模式的c++实现,若理解有误,还请指正。
设计模式专题之(二十一)状态模式---设计模式状态模式示例代码(python--c++)
状态模式(State) 用意:允许一个对象当状态改变时,改变其行为。
首先了解什么是状态模式,然后思考为何产生这种模式,意义何在。同时能够在实际的代码中体现这种模式,并且对比使用该模式与不使用的区别何在。
面向对象系统分析设计——对象设计,状态模式
状态模式的示例代码和文档,学习状态模式的参考资料。
设计模式-状态模式分享ppt
状态模式-State Pattern状态模式-State Pattern【学习难度:,使用频率:】状态模式-State Pattern处理对象的多种状态及其相互