用java实现状态模式
时间: 2023-03-11 18:44:39 浏览: 84
Java 状态模式是一种行为设计模式,它允许对象在其内部状态改变时改变它的行为。它通过将状态的责任委托给独立的状态对象来实现,可以使对象在不同状态下具有不同的行为。要使用Java实现状态模式,需要定义一个抽象状态类,它定义了状态之间的切换,以及每种状态下的行为。然后,可以定义具体的状态类来实现抽象状态类中定义的行为。最后,需要定义一个具体的上下文类,它维护了一个当前状态的引用,并允许客户端改变状态。
相关问题
java 状态模式实现酒店订房系统
状态模式是一种行为设计模式,它允许一个对象在内部状态改变时改变其行为。在酒店订房系统中,我们可以使用状态模式来实现不同状态下的行为,例如预订房间、取消预订、入住、退房等。以下是状态模式实现酒店订房系统的示例代码:
```java
// 抽象状态类
interface State {
void bookRoom(HotelRoom room);
void cancelRoom(HotelRoom room);
void checkIn(HotelRoom room);
void checkOut(HotelRoom room);
}
// 具体状态类:空房间状态
class VacancyState implements State {
public void bookRoom(HotelRoom room) {
System.out.println("房间已被预订!");
room.setState(new OccupiedState());
}
public void cancelRoom(HotelRoom room) {
System.out.println("房间未被预订,无法取消预订!");
}
public void checkIn(HotelRoom room) {
System.out.println("入住成功!");
room.setState(new OccupiedState());
}
public void checkOut(HotelRoom room) {
System.out.println("房间未被预订,无法退房!");
}
}
// 具体状态类:已入住状态
class OccupiedState implements State {
public void bookRoom(HotelRoom room) {
System.out.println("房间已被预订!");
}
public void cancelRoom(HotelRoom room) {
System.out.println("取消预订成功!");
room.setState(new VacancyState());
}
public void checkIn(HotelRoom room) {
System.out.println("房间已被入住,无法再次入住!");
}
public void checkOut(HotelRoom room) {
System.out.println("退房成功!");
room.setState(new VacancyState());
}
}
// 上下文类:酒店房间
class HotelRoom {
private State state;
public HotelRoom() {
this.state = new VacancyState();
}
public void setState(State state) {
this.state = state;
}
public void bookRoom() {
this.state.bookRoom(this);
}
public void cancelRoom() {
this.state.cancelRoom(this);
}
public void checkIn() {
this.state.checkIn(this);
}
public void checkOut() {
this.state.checkOut(this);
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
HotelRoom room = new HotelRoom();
room.bookRoom(); // 房间已被预订!
room.checkIn(); // 入住成功!
room.checkIn(); // 房间已被入住,无法再次入住!
room.checkOut(); // 退房成功!
room.checkOut(); // 房间未被预订,无法退房!
room.cancelRoom(); // 取消预订成功!
room.cancelRoom(); // 房间未被预订,无法取消预订!
}
}
```
在上述代码中,我们定义了一个抽象状态类 State 和两个具体状态类 VacancyState 和 OccupiedState。具体状态类实现了抽象状态类定义的方法,同时也可以转换状态。然后,我们定义了一个上下文类 HotelRoom,它包含一个状态对象,并提供了一组接口,用于修改状态。最后,我们使用客户端代码来模拟用户对酒店房间的操作。
使用java实现观察者模式
观察者模式是一种常见的设计模式,它的主要思想是在对象之间建立一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
在Java中,观察者模式的实现需要定义两个角色:Subject(主题)和Observer(观察者)。Subject负责维护一组观察者对象,以及通知它们状态的变化;而Observer则负责接收Subject的通知,并做出相应的处理。
下面是一个简单的Java实现:
```java
import java.util.ArrayList;
import java.util.List;
// 主题接口
interface Subject {
void attach(Observer observer); // 添加观察者
void detach(Observer observer); // 移除观察者
void notifyObservers(); // 通知所有观察者
}
// 观察者接口
interface Observer {
void update(); // 更新状态
}
// 具体主题类
class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<>();
public void attach(Observer observer) {
observers.add(observer);
}
public void detach(Observer observer) {
observers.remove(observer);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
// 主题状态的变化
public void changeState() {
// do something
notifyObservers(); // 通知所有观察者
}
}
// 具体观察者类
class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
public void update() {
System.out.println(name + " has received the update.");
}
}
// 测试
public class ObserverPatternDemo {
public static void main(String[] args) {
Subject subject = new ConcreteSubject();
Observer observer1 = new ConcreteObserver("Observer1");
Observer observer2 = new ConcreteObserver("Observer2");
Observer observer3 = new ConcreteObserver("Observer3");
subject.attach(observer1);
subject.attach(observer2);
subject.attach(observer3);
((ConcreteSubject) subject).changeState();
subject.detach(observer2);
((ConcreteSubject) subject).changeState();
}
}
```
在这个例子中,我们定义了Subject和Observer两个接口,以及它们的具体实现类ConcreteSubject和ConcreteObserver。其中ConcreteSubject负责维护一组观察者对象,并在状态变化时通知它们;而ConcreteObserver则负责接收Subject的通知,并做出相应的处理。
在测试代码中,我们创建了一个ConcreteSubject对象,并向它添加了三个ConcreteObserver观察者。然后我们调用changeState()方法改变主题的状态,这会触发ConcreteSubject通知所有观察者。最后我们移除了一个观察者,并再次调用changeState()方法,这时只有两个观察者会收到通知。