剧组在拍戏,演员深情的讲着自己的独白“该配合你演出的我演视而不见,在逼一个最爱你的人即兴表演”,导演看后并不满意要重拍第二句,场记会记录演员重拍时的布景、台词、演员的动作表情,等到重拍的时候恢复到此状态。
模式定义: 在不破坏封装性的前提下,获取到一个对象的内部状态,并在对象之外记录或保存这个状态。
案例说明: 拍电影不可能一次过,出现NG也没必要从头再拍,通过场记管理NG桥段的布景、演员台词、动作等进行重拍,这看起像事务回滚。
优点: 提供了一种可以恢复状态的机制。
注意: 为了节约内存,可使用原型模式+备忘录模式
代码:演员
public class Actor {
//台词
private String lines = "该配合你演出的我演视而不见,在逼一个最爱你的人即兴表演。";
//讲台词
public void say() {
System.out.println("演员:"+lines);
}
public Memento saveStateToMemento(){
return new Memento("在逼一个最爱你的人即兴表演");
}
public void getStateFromMemento(Memento Memento){
lines = Memento.lines;
}
}
导演
public class Director {
//是否要NG
public static boolean isNG() {
System.out.println("导演:第二句表情没到位,重拍这一句");
return true;
}
}
场记
public class Supervisor {
private Memento memento;
//获取备份
public Memento getMemento() {
return memento;
}
//保存备份
public void setMemento(Memento memento) {
this.memento = memento;
}
}
台词记录
public class Memento {
public String lines;
public Memento(String lines) {
this.lines = lines;
}
}
测试
public class Test {
public static void main(String arg[]) {
Actor actor = new Actor();
actor.say();//演员讲台词
if (Director.isNG()) {
Supervisor supervisor = new Supervisor();
supervisor.setMemento(actor.saveStateToMemento());//场记记录
System.out.println("------休息过后,重拍------");
actor.getStateFromMemento(supervisor.getMemento());//演员通过场记获得重演台词
actor.say();
}
}
}
结果
演员:该配合你演出的我演视而不见,在逼一个最爱你的人即兴表演。
导演:第二句表情没到位,重拍这一句
------休息过后,重拍-----
演员:在逼一个最爱你的人即兴表演