GOF23设计模式(十四)

GOF设计模式之状态模式(state)与观察者模式(Observer)

状态模式(state)

用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。

状态接口

1
2
3
public interface State {
void handle();
}

实现接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
* 空闲状态
*
*/
public class FreeState implements State{

@Override
public void handle() {
System.out.println("房间空闲没人住");
}
}

/**
* 预订状态
*
*/
public class BookedState implements State{

@Override
public void handle() {
System.out.println("房间已预订");
}
}

/**
* 已入住状态
*
*/
public class CheckedInState implements State{

@Override
public void handle() {
System.out.println("房间已入住");
}
}

状态管理

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 房间状态管理
*
*/
public class HomeContext {
private State state;
public void setState(State s) {
System.out.println("修改状态");
state=s;
state.handle();
}
}

测试

1
2
3
4
5
6
7
8
9
public class Client {

public static void main(String[] args) {
HomeContext c=new HomeContext();
c.setState(new FreeState());

c.setState(new BookedState());
}
}

结果

修改状态
房间空闲没人住
修改状态
房间已预订

观察者模式(Observer)

主要用于1:N的通知。当一个对象的状态变化时,他需要及时告知一系列对象,令他们做出响应。

接口

1
2
3
public interface Observer {
void update(Subject subject);
}

实现接口

1
2
3
4
5
6
7
8
9
10
11
12
13
public class ObserverA implements Observer{
private int Mystate; //与目标对象保持一致
@Override
public void update(Subject subject) {
Mystate=((ConcreteSubject)subject).getState();
}
public int getMystate() {
return Mystate;
}
public void setMystate(int mystate) {
Mystate = mystate;
}
}

观察者容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Subject {
protected List<Observer> list =new ArrayList<>();
public void register(Observer obs) {
list.add(obs);
}
public void removeObserver(Observer obs) {
list.remove(obs);
}
//通知所有观察者更新状态
public void notifyAllObserver() {
for (Observer observer : list) {
observer.update(this);
}
}
}

继承

1
2
3
4
5
6
7
8
9
10
11
12
13
public class ConcreteSubject extends Subject{
private int state;

public int getState() {
return state;
}

public void setState(int state) {
this.state = state;
//值发生了变化
this.notifyAllObserver();
}
}

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Client {

public static void main(String[] args) {
//目标对象
ConcreteSubject subject =new ConcreteSubject();
//观察者
ObserverA a = new ObserverA();
ObserverA b = new ObserverA();
ObserverA c = new ObserverA();
//添加到容器里去
subject.register(a);
subject.register(b);
subject.register(c);

//改变subjec状态
subject.setState(200);
//查看观察者状态
System.out.println(a.getMystate());
System.out.println(b.getMystate());
System.out.println(c.getMystate());
}
}

结果

200
200
200

原创技术分享,您的支持将鼓励我继续创作
0%