前言
审查流程是一种常见的业务流程,它通常涉及到多个参与方的协作和决策,因此需要一种可靠的设计模式来实现。在本文中,我们将探讨两种设计模式:观察者模式和状态模式,来实现审查流程。
观察者模式
观察者模式是一种行为型设计模式,它定义了对象之间一对多的依赖关系,使得当一个对象状态发生改变时,所有依赖它的对象都会得到通知并自动更新。在审查流程中,我们可以将审查对象作为主题,将所有需要接收审查结果通知的参与方作为观察者,当审查结果发生变化时,通知所有观察者进行相应的操作。
示例代码:
class Subject {
constructor() {
this.observers = []; // 存储所有观察者的数组
}
addObserver(observer) { // 添加观察者的方法
this.observers.push(observer);
}
removeObserver(observer) { // 移除观察者的方法
this.observers = this.observers.filter(o => o !== observer);
}
notify() { // 通知所有观察者更新的方法
this.observers.forEach(observer => observer.update());
}
}
class Observer {
update() { // 观察者更新方法
console.log('Observer updated');
}
}
const subject = new Subject(); // 创建主题对象
const observer1 = new Observer(); // 创建观察者1对象
const observer2 = new Observer(); // 创建观察者2对象
subject.addObserver(observer1); // 添加观察者1
subject.addObserver(observer2); // 添加观察者2
subject.notify(); // 通知所有观察者更新
在上面的代码中,我们定义了一个Subject类作为主题,其中包含了一个observers数组来维护所有的观察者。在addObserver方法中,我们将一个观察者添加到observers数组中。在removeObserver方法中,我们将一个观察者从observers数组中移除。在notify方法中,我们遍历observers数组,调用每个观察者的update方法。
我们还定义了一个Observer类作为观察者,在update方法中输出了一条日志。
最后,我们创建了一个Subject实例,并添加了两个Observer实例。然后,我们调用了notify方法,观察者都收到了通知并输出了一条日志。
状态模式
状态模式是一种行为型设计模式,它允许对象在内部状态改变时改变它的行为,从而使对象看起来像是改变了它的类。在审查流程中,我们可以将审查状态定义为一个状态接口,并为每个状态实现对应的行为。这样,当审查状态发生改变时,审查对象只需要更新其状态,就可以自动更新其行为。
示例代码:
class State {
doAction(context) {} // 状态执行方法
}
class StartState extends State {
doAction(context) { // 开始状态执行方法
console.log('Start state');
context.setState(this); // 设置当前状态为开始状态
}
}
class StopState extends State {
doAction(context) { // 停止状态执行方法
console.log('Stop state');
context.setState(this); // 设置当前状态为停止状态
}
}
class Context {
constructor() {
this.state = null; // 当前状态
}
setState(state) { // 设置状态的方法
this.state = state;
}
getState() { // 获取当前状态的方法
return this.state;
}
}
const context = new Context(); // 创建上下文对象
const startState = new StartState(); // 创建开始状态对象
startState.doAction(context); // 执行开始状态
console.log(context.getState()); // 输出当前状态
const stopState = new StopState(); // 创建停止状态对象
stopState.doAction(context); // 执行停止状态
console.log(context.getState()); // 输出当前状态
在上面的代码中,我们定义了一个State类作为状态接口,其中包含了一个doAction方法,表示状态对应的行为。我们还定义了StartState和StopState两个具体状态类,分别对应审查流程的开始和结束状态。
我们定义了一个Context类作为审查对象,其中包含了一个state属性来维护当前状态。在setState方法中,我们将传入的状态设置为当前状态。在getState方法中,我们返回当前状态。
最后,我们创建了一个Context实例,并分别创建了StartState和StopState实例。然后,我们分别调用了它们的doAction方法,并输出了当前的状态。
结合观察者模式和状态模式实现审查流程
我们已经了解了观察者模式和状态模式的实现方式。现在,我们将这两种模式结合起来,实现一个简单的审查流程。在这个流程中,我们有三个角色:审查对象、审查员和管理员。审查对象的状态包括“未审查”、“已通过”和“未通过”,而审查员和管理员都是观察者,当审查对象状态发生改变时,会自动收到通知。
示例代码:
// 状态接口,定义了状态对应的行为
class State {
doAction(context) {}
}
// 未审查状态
class PendingState extends State {
doAction(context) {
console.log('Pending state'); // 输出当前状态
context.setState(this); // 更新状态为当前状态
}
}
// 审查通过状态
class ApprovedState extends State {
doAction(context) {
console.log('Approved state'); // 输出当前状态
context.setState(this); // 更新状态为当前状态
}
}
// 审查拒绝状态
class RejectedState extends State {
doAction(context) {
console.log('Rejected state'); // 输出当前状态
context.setState(this); // 更新状态为当前状态
}
}
// 审查对象
class Context {
constructor() {
this.state = null; // 当前状态为空
this.observers = []; // 观察者列表为空
}
// 更新状态
setState(state) {
this.state = state;
this.notifyObservers(); // 通知所有观察者
}
// 获取当前状态
getState() {
return this.state;
}
// 添加观察者
addObserver(observer) {
this.observers.push(observer);
}
// 移除观察者
removeObserver(observer) {
const index = this.observers.indexOf(observer);
if (index !== -1) {
this.observers.splice(index, 1);
}
}
// 通知所有观察者
notifyObservers() {
this.observers.forEach(observer => {
observer.update();
});
}
}
// 观察者接口
class Observer {
update() {}
}
// 审查员
class Reviewer extends Observer {
constructor(name) {
super();
this.name = name;
}
// 更新
update() {
console.log(`Reviewer ${this.name} received notification`);
}
}
// 管理员
class Admin extends Observer {
constructor(name) {
super();
this.name = name;
}
// 更新
update() {
console.log(`Admin ${this.name} received notification`);
}
}
// 创建审查对象
const context = new Context();
// 创建观察者
const reviewer1 = new Reviewer('Alice');
const reviewer2 = new Reviewer('Bob');
const admin = new Admin('Charlie');
// 将观察者添加到审查对象的观察者列表中
context.addObserver(reviewer1);
context.addObserver(reviewer2);
context.addObserver(admin);
// 创建状态对象
const pendingState = new PendingState();
const approvedState = new ApprovedState();
const rejectedState = new RejectedState();
// 将状态对象设置为审查对象的状态
context.setState(pendingState);
console.log(context.getState()); // 输出当前状态
// 更新状态为“审查通过”
context.setState(approvedState);
console.log(context.getState()); // 输出当前状态
// 更新状态为“审查拒绝”
context.setState(rejectedState);
console.log(context.getState()); // 输出当前状态
上述代码实现了一个简单的审查流程,其中包括了观察者模式和状态模式。代码中包含了如下的状态模式和观察者模式的设计思路:
- 状态模式:将对象的行为和状态分离开来,使对象在不同的状态下表现出不同的行为。这里通过定义了状态接口,然后定义了具体的状态类,并在状态类中实现了对应状态的行为。
- 观察者模式:定义了一种一对多的关系,当一个对象状态改变时,所有依赖于它的对象都会得到通知并自动更新。这里通过定义了观察者接口和具体的观察者类,并在审查对象的状态改变时,通知所有的观察者。
同时,代码中也体现了设计模式的优点:
- 状态模式:让代码更加清晰,易于维护和扩展。如果要新增一种状态,只需要实现对应状态的类即可,不会对现有代码产生影响。
- 观察者模式:让对象之间的耦合度降低,不需要让一个对象硬编码去知道其他对象的存在,使得对象之间更加松散耦合,更易于维护和扩展。
状态模式和观察者模式的结合,为实现复杂的审查流程提供了一种优雅、灵活的方式。