状态模式的定义是“类的行为根据其状态的改变而改变”。在状态模式中,我们创建代表各种状态的对象,以及一个上下文对象,其行为随着状态对象的改变而变化。

状态模式也被称为对象状态

优点:

  • 它保持了状态特定的行为。
  • 它使任何状态转换显式化。

使用场景:

  • 当对象的行为依赖于其状态,并且必须能够在运行时根据新状态改变其行为时。
  • 当操作具有依赖于对象状态的复杂的多部分条件语句时使用。

状态模式的UML:

8-1.png

状态模式的实现:

步骤 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

标签: Design Patterns, Design Patterns教程, 设计模式, 软件设计, 结构型模式, 行为型模式, 单例模式, 工厂模式, 观察者模式, 中介者模式, 访问者模式