设计模式之状态模式

状态模式

  1. 状态模式结构图:

  2. 示例代码:

    // 抽象状态类
    public abstract class Status {
    
        protected ApplicationContext context;
    
        public void setContext(ApplicationContext context) {
            this.context = context;
        }
    
        abstract void handle();
    }
    
    // 具体状态类A
    public class ConcreteStatusA extends Status{
    
        @Override
        public void handle() {
            System.out.println("状态A执行当前处理");
        }
    }
    
    // 具体状态类B
    public class ConcreteStatusB extends Status{
    
        @Override
        public void handle() {
            System.out.println("状态B执行当前处理");
            context.setStatus(ApplicationContext.STATUS_A);
            context.getStatus().handle();
        }
    }
    
    // 容器类
    @Data
    public class ApplicationContext {
        public static final Status STATUS_A = new ConcreteStatusA();
        public static final Status STATUS_B = new ConcreteStatusB();
        private Status status;
    
        {
            STATUS_A.setContext(this);
            STATUS_B.setContext(this);
        }
    
        public Status getStatus() {
            return status;
        }
    
        public void setStatus(Status status) {
            this.status = status;
            this.status.setContext(this);
        }
    
        public void handle(){
            this.status.handle();
        }
    }
    
    // 测试
    public class StatusTest {
    
        public static void main(String[] args) {
            ApplicationContext context = new ApplicationContext();
            context.setStatus(ApplicationContext.STATUS_A);
            context.handle();
            System.out.println("===================");
            context.setStatus(ApplicationContext.STATUS_B);
            context.handle();
        }
    }
    
    
  3. 总结:

    优点:将状态独立为类,提高了系统的可维护性;状态类职责明确且具备扩展性;

    缺点:如果一个事物具备很多的状态,则会造成状态类太多,状态类的结构和实现都较为复杂,且对开闭原则支持并不好.

posted @   justKen  阅读(45)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
点击右上角即可分享
微信分享提示