首页 > 其他分享 >状态模式:用类表示状态

状态模式:用类表示状态

时间:2023-06-14 18:23:56浏览次数:37  
标签:用类 door 状态 void 模式 println Door public DoorState

在不使用状态模式之前,我们经常通过

if(state1) {
	// do state1 something
} else if(state2) {
	// do state2 something
} else {
	// do other something
}

在状态设计模式中,对象根据其内部状态的不同而改变其行为。这样,对象可以看起来像它们已经改变了类。状态模式通过将每个特定状态的行为封装在单独的类中来实现这一点。这些类被称为“状态类”,并且它们通常会实现一个公共的接口或抽象类。这个接口/抽象类定义了在特定状态下对象应该具有的所有方法。

示例代码

// DoorState interface
interface DoorState {
    void open();
    void close();
    void lock();
    void unlock();
}

// OpenedState class
class OpenedState implements DoorState {
    public void open() {
        System.out.println("The door is already opened");
    }
    
    public void close() {
        System.out.println("Closing the door");
        Door.setState(Door.getClosedState());
    }
    
    public void lock() {
        System.out.println("The door must be closed before it can be locked");
    }
    
    public void unlock() {
        System.out.println("The door is already unlocked");
    }
}

// ClosedState class
class ClosedState implements DoorState {
    public void open() {
        System.out.println("Opening the door");
        Door.setState(Door.getOpenedState());
    }
    
    public void close() {
        System.out.println("The door is already closed");
    }
    
    public void lock() {
        System.out.println("Locking the door");
        Door.setState(Door.getLockedState());
    }
    
    public void unlock() {
        System.out.println("The door is not locked");
    }
}

// LockedState class
class LockedState implements DoorState {
    public void open() {
        System.out.println("The door is locked, it cannot be opened");
    }
    
    public void close() {
        System.out.println("The door is locked, it cannot be closed");
    }
    
    public void lock() {
        System.out.println("The door is already locked");
    }
    
    public void unlock() {
        System.out.println("Unlocking the door");
        Door.setState(Door.getClosedState());
    }
}

// Door class
class Door {
    private DoorState currentState;
    private static final DoorState OPENED_STATE = new OpenedState();
    private static final DoorState CLOSED_STATE = new ClosedState();
    private static final DoorState LOCKED_STATE = new LockedState();
    
    public Door() {
        currentState = CLOSED_STATE;
    }
    
    public void setState(DoorState state) {
        currentState = state;
    }
    
    public DoorState getCurrentState() {
        return currentState;
    }
    
    public static DoorState getOpenedState() {
        return OPENED_STATE;
    }
    
    public static DoorState getClosedState() {
        return CLOSED_STATE;
    }
    
    public static DoorState getLockedState() {
        return LOCKED_STATE;
    }
    
    public void open() {
        currentState.open();
    }
    
    public void close() {
        currentState.close();
    }
    
    public void lock() {
        currentState.lock();
    }
    
    public void unlock() {
        currentState.unlock();
    }
}

// Example usage
Door door = new Door();
door.lock(); // prints "The door is already locked"
door.unlock(); // prints "Unlocking the door"
door.lock(); // prints "Locking the door"
door.open(); // prints "Opening the door"
door.close(); // prints "Closing the door"

在上面的示例中,我们创建了一个门对象和三个状态类:OpenedStateClosedStateLockedState。每个状态类都实现了DoorState接口,并定义了在特定状态下门应该具有的所有方法,同时Door对象将会持有DoorState对象,通过使用当前持有DoorState对象进行操作,而DoorState实现类对象也应该存入Door对象以便修改Door对象操作后的状态。

标签:用类,door,状态,void,模式,println,Door,public,DoorState
From: https://www.cnblogs.com/li053/p/17480301.html

相关文章

  • hadoop状态和任务监控
    #-*-coding:UTF-8-*-importmysql.connectorimportsysimportdatetimeimportimportlibimportrequestsimportlib.reload(sys)#修改hadoop地址参数为实际地址env_code='生产环境http://172.16.159.75:18888/'hadoop_code='生产环境hadoophttp://172.16.159.75......
  • Java8-Predicate 策略模式的替代品消灭 if else
    使用策略模式消灭ifelse,可以利用Java8的新特性来实现策略模式。利用Java8的Predicate消灭ifelse。首先定义一个map,key是不同的服务代码,value是需要做校验的条件,然后针对不同的服务代码做校验。当然Supplier、Consumer都可以做类似的实现。//定义校验的策略映射关系staticM......
  • 抽象工厂模式-04
    概述抽象工厂(abstractfactory)模式又称Kit模式,由一个抽象工厂类、多个抽象产品类以及这些抽象类的多个具体子类构成。每个具体工厂类可以创建每个抽象产品类的某个具体子类。优点:高内聚低耦合,符合“开闭原则”。缺点:难以添加新的产品类,这涉及到更改抽象工厂类,这个类的修......
  • 建造者模式-05
    概述建造者模式(BuilderPattern)又称生成器模式(视翻译而定)。该模式由一个抽象建造者类、多个具体建造者类、被创建的复杂类、指挥者(director)类构成。抽象建造者类定义被创建类的创建步骤;具体创建者类根据不同目的实现创建步骤;被创建类定义自身的复杂属性成员;指挥者类使用具......
  • 策略模式:整体替换算法
    策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在策略模式中,我们定义了多个算法,并将每个算法封装在一个独立的类中(策略类),以便在运行时根据需要进行切换。这使得算法与调用其算法的客户端代码分离,从而实现了更高的灵活性和可维护性。主要实现方式:1策略接口->n*具......
  • java开发操作系统内核:由实模式进入保护模式之32位寻址
    从时模式到保护模式,是计算法技术跨时代的发展。大家想想笨拙的Dos界面,黑底白字的那种冷漠界面到win95各种色彩斑斓的窗口,两者之间的区别其实就是实模式和保护模式的天壤之别。保护模式中,最重要的一个概念莫过于”保护”二字,有了“保护”功能后,CPU为软件提供了很多的功能,当然也有了......
  • 保护模式超强的寻址功能:天空任鸟飞
    X86架构下,cpu的运行模式分两种,一种是实模式,像早期Dos那种黑底白字的命令行操作界面,可以说是实模式最好表现形式,在实模式下也只能产生这种冰冷,呆板,机械的用户体验。后来Intel的CPU进一步发展,引入了保护模式,由此,操作系统的发展进入了新的时代,在保护模式下,CPU功能进一步增强,进而支撑......
  • LR(1) 有限状态机的压缩
    上一节描述的状态机构造算法,有一步骤有些问题,特此先进行更正,有问题的步骤是这样的,在计算lookahead集合的时候,需要把β和C首尾相连后再计算First集合,特此更正,具体算法步骤,我们再过一遍。假定表达式形式及其lookahead集合形式如下:[S->a.xβ,C]x是非终结符,其对应的表达......
  • java开发编译器:LR 状态机的缺陷与改进
    前两节我们构造的状态机有些缺陷,当我们进入某个状态节点时,根据该节点的特性,我们需要产生一些动作,根据上两节的有限状态机图,当我们进入节点5,我们发现,符号”.”为位于表达式的最右边,在.后面不再有其他非终结符或终结符,进入这样的节点时,我们要根据表达式做一次reduce操作,例如在节点5......
  • 盲盒的玩法模式都有哪些
    1.固定库存模式,100个盒子,可以该池子里随意抽奖,直到把100个盒子抽完。这种模式与原来的一元购有点相似,但经过这么多年的演变,它已经发展得更加合规。2.随机无库存模式,只设置概率,不设置库存,用户根据概率购买奖品。只不过在小程序里用这种模式的话,上线审核很难通过。通常以H5或应用程序......