Design Patterns教程-状态模式
状态模式的定义是“类的行为根据其状态的改变而改变”。在状态模式中,我们创建代表各种状态的对象,以及一个上下文对象,其行为随着状态对象的改变而变化。
状态模式也被称为对象状态。
优点:
- 它保持了状态特定的行为。
- 它使任何状态转换显式化。
使用场景:
- 当对象的行为依赖于其状态,并且必须能够在运行时根据新状态改变其行为时。
- 当操作具有依赖于对象状态的复杂的多部分条件语句时使用。
状态模式的UML:
状态模式的实现:
步骤 1:
创建一个Connection
接口,该接口将提供连接到Controller
类的功能。
// 这是一个接口
public interface Connection {
public void open();
public void close();
public void log();
public void update();
}
步骤 2:
创建一个实现Connection
接口的Accounting
类。
// 这是一个类
public class Accounting implements Connection {
@Override
public void open() {
System.out.println("open database for accounting");
}
@Override
public void close() {
System.out.println("close the database");
}
@Override
public void log() {
System.out.println("log activities");
}
@Override
public void update() {
System.out.println("Accounting has been updated");
}
}
步骤 3:
创建一个实现Connection
接口的Sales
类。
// 这是一个类
public class Sales implements Connection {
@Override
public void open() {
System.out.println("open database for sales");
}
@Override
public void close() {
System.out.println("close the database");
}
@Override
public void log() {
System.out.println("log activities");
}
@Override
public void update() {
System.out.println("Sales has been updated");
}
}
步骤 4:
创建一个实现Connection
接口的Management
类。
// 这是一个类
public class Management implements Connection {
@Override
public void open() {
System.out.println("open database for Management");
}
@Override
public void close() {
System.out.println("close the database");
}
@Override
public void log() {
System.out.println("log activities");
}
@Override
public void update() {
System.out.println("Management has been updated");
}
}
步骤 5:
创建一个Controller
类,该类将使用Connection
接口连接不同类型的连接。
// 这是一个类
public class Controller {
public static Accounting acct;
public static Sales sales;
public static Management management;
private static Connection con;
Controller() {
acct = new Accounting();
sales = new Sales();
management = new Management();
}
public void setAccountingConnection() {
con = acct;
}
public void setSalesConnection() {
con = sales;
}
public void setManagementConnection() {
con = management;
}
public void open() {
con.open();
}
public void close() {
con.close();
}
public void log() {
con.log();
}
public void update() {
con.update();
}
}
步骤 6:
创建一个StatePatternDemo
类。
// 这是一个类
public class StatePatternDemo {
Controller controller;
StatePatternDemo(String con) {
controller = new Controller();
// 以下触发应由用户完成
if(con.equalsIgnoreCase("management"))
controller.setManagementConnection();
if(con.equalsIgnoreCase("sales"))
controller.setSalesConnection();
if(con.equalsIgnoreCase("accounting"))
controller.setAccountingConnection();
controller.open();
controller.log();
controller.close();
controller.update();
}
public static void main(String args[]) {
new StatePatternDemo(args[0]);
}
}
输出:
当传入不同的参数时,程序会输出对应连接的操作日志。例如:
open database for sales
log activities
close the database
Sales has been updated