状态模式:用类表示状态
1.工厂模式:提供创建对象的接口2.单例模式:生成只存在一个的实例3.桥接模式:将类的功能层次和实现层次分离,动态结合4.享元模式:避免大量相同开销5.原型模式:通过复制生成实例6.建造者模式:组装复杂实例7.职责链模式:推卸责任8.模板模式:具体的步骤延迟到子类中实现9.迭代器模式:一个个遍历10.外观模式:隐藏了复杂系统的复杂性,并提供一个简单的接口来访问系统11.代理模式:为其他对象提供一种代理以控制对这个对象的访问12.适配器模式:将两个不兼容的类纠合在一起13.组合模式:处理树形结构数据14.装饰器模式:动态给一个对象添加一些额外的职责15.命令模式:命令也是类16.访问者模式:访问数据结构并处理数据17.观察者模式:发送状态变化通知
18.状态模式:用类表示状态
19.策略模式:整体替换算法20.解释器模式:语法规则也是类21.中介者模式:只有一个仲裁者22.备忘录模式:保存对象状态在不使用状态模式之前,我们经常通过
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"
在上面的示例中,我们创建了一个门对象和三个状态类:OpenedState
、ClosedState
和LockedState
。每个状态类都实现了DoorState
接口,并定义了在特定状态下门应该具有的所有方法,同时Door
对象将会持有DoorState
对象,通过使用当前持有DoorState
对象进行操作,而DoorState
实现类对象也应该存入Door
对象以便修改Door
对象操作后的状态。
合集:
Java设计模式
分类:
Java设计模式 / 行为型模式
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性