状态模式代码举例(java语言版)

本文介绍状态模式在饮水机中的应用,通过JAVA语言实现不同状态的切换,如水满和无水状态,展示了如何使用状态模式来管理有限的状态转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:在行为受状态约束的时候使用状态模式,而且状态不超过 5 个(谨用)。这里举一个饮水机与水桶的例子

JAVA语言版状态模式

创建状态接口:

public interface BucketState {
    void press();
}

创建状态接口的实现类:

public class BucketStateFull implements BucketState{
    @Override
    public void press() {
        System.out.println("正在倒水");
    }
}

public class BucketStateNull implements BucketState{
    @Override
    public void press() {
        System.out.println("没有水了");
    }
}

创建饮水机实体类:

public class WaterDispenser {
    private int capacity = 5;
    private BucketState bucketState;

    public WaterDispenser(BucketState bucketState) {
        this.bucketState = bucketState;
    }
    
    public void press() {
        capacity--;
        if (capacity <= 0) {
            this.bucketState = new BucketStateNull();
        }
        bucketState.press();
    }
}

使用StatePatternDemo类演示接水饮水机状态改变

public class StatePatternDemo {
    public static void main(String[] args) {
        WaterDispenser waterDispenser =new WaterDispenser(new BucketStateFull());
        for(int i=0;i<5;i++){
            waterDispenser.press();
        }
    }
}

输出结果:

正在倒水
正在倒水
正在倒水
正在倒水
没有水了

 

<think>好的,我需要回答用户关于Java设计模式的问题,并提供示例代码和解释。首先,用户提到了几个引用,特别是解释器模式、原型模式等,所以需要结合这些内容。 首先,我应该简要介绍设计模式的概念,说明它们在软件开发中的重要性。然后,选择几个常见的设计模式,比如单例模式、工厂模式、观察者模式,再加上用户提到的解释器模式和原型模式。每个模式都需要给出定义、适用场景、示例代码以及解释。 要注意引用用户提供的资料,比如在解释器模式部分引用[^4]和[^2],在原型模式部分引用[^3]。同时,代码示例要符合Java语法,正确展示模式的结构。例如,单例模式的双重检查锁定,工厂模式的产品接口和具体实现,观察者模式的Subject和Observer接口。 然后,生成相关问题,确保问题与提到的设计模式相关,比如单例的线程安全、工厂模式与抽象工厂的区别、观察者模式的应用场景等。要确保问题覆盖不同的模式,并引导深入学习。 最后,检查是否符合系统级指令:行内数学公式用$...$,但这里可能用不上。独立公式不需要,但代码块要用正确格式。确保使用中文,引用正确标注。回答结构清晰,分点解释,代码示例正确,相关问题合理。</think>### Java设计模式示例与解释 设计模式是解决软件设计中常见问题的可复用方案。以下是几种典型设计模式的示例及解释: --- #### 1. **单例模式(Singleton)** **定义**:确保一个类仅有一个实例,并提供全局访问点。 **适用场景**:日志记录器、数据库连接池等需要唯一实例的场景。 ```java public class Singleton { private static volatile Singleton instance; private Singleton() {} // 私有构造方法 public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } ``` **解释**:通过双重检查锁定(Double-Checked Locking)确保线程安全和延迟加载[^3]。 --- #### 2. **工厂模式(Factory Method)** **定义**:定义一个创建对象的接口,但由子类决定实例化哪个类。 **适用场景**:需要解耦对象创建与使用的场景(如不同数据库驱动)。 ```java interface Product { void operation(); } class ConcreteProductA implements Product { @Override public void operation() { System.out.println("产品A的操作"); } } class ProductFactory { public Product createProduct(String type) { if ("A".equals(type)) { return new ConcreteProductA(); } return null; } } ``` **解释**:工厂类通过参数动态创建具体产品,实现代码扩展性。 --- #### 3. **观察者模式(Observer)** **定义**:定义对象间的一对多依赖,当一个对象状态改变时,所有依赖它的对象自动更新。 **适用场景**:事件处理、消息订阅等。 ```java interface Observer { void update(String message); } class ConcreteObserver implements Observer { @Override public void update(String message) { System.out.println("收到消息:" + message); } } class Subject { private List<Observer> observers = new ArrayList<>(); public void addObserver(Observer observer) { observers.add(observer); } public void notifyObservers(String message) { for (Observer observer : observers) { observer.update(message); } } } ``` **解释**:主题(Subject)维护观察者列表,状态变化时遍历通知所有观察者。 --- #### 4. **解释器模式(Interpreter)** **定义**:定义语言的文法,并用解释器解释语言中的句子。 **适用场景**:编译器、规则引擎等需要解析特定语法的场景。 ```java interface Expression { int interpret(Map<String, Integer> context); } class Number implements Expression { private int value; public Number(int value) { this.value = value; } @Override public int interpret(Map<String, Integer> context) { return value; } } class Add implements Expression { private Expression left, right; public Add(Expression left, Expression right) { this.left = left; this.right = right; } @Override public int interpret(Map<String, Integer> context) { return left.interpret(context) + right.interpret(context); } } ``` **解释**:通过组合表达式对象实现语法解析,例如`new Add(new Number(1), new Number(2))`会返回3。 --- #### 5. **原型模式(Prototype)** **定义**:通过复制现有对象来创建新对象,避免重复初始化开销[^3]。 **适用场景**:对象创建成本较高或需要动态配置的场景。 ```java class Prototype implements Cloneable { private String data; public Prototype(String data) { this.data = data; } @Override public Prototype clone() throws CloneNotSupportedException { return (Prototype) super.clone(); // 浅拷贝 } } ``` **解释**:需实现`Cloneable`接口,浅拷贝仅复制引用,深拷贝需递归复制对象属性。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值