public class Saifu {
int zan;
public Saifu(int kin) {
zan = kin;
}
public void printZan() {
System.out.println("ZANDAKA="+zan);
}
public int hiki(int kin) {
zan -= kin;
return zan;
}
public int nyu(int kin) {
zan += kin;
return zan;
}
public static void main(String[] args) {
Saifu w1 = new Saifu(200);
Saifu w2 = new Saifu(500);
w1.nyu(100);
w2.hiki(100);
w1.printZan();
w2.printZan();
}
public Saifu clone() {
return new Saifu(zan);
}
}
public class SafeSaifu {
Saifu me;
Saifu yo;
public SafeSaifu(Saifu me, Saifu yo) {
this.me = me;
this.yo = yo;
}
public nyu(int kin, Sagyo sagyo) {
Saifu me2 = me.clone();
Saifu yo2 = yo.clone();
try {
sagyo.pre(kin, me2);
me2.nyu(kin);
sagyo.cur(kin, me2, yo2);
yo2.hiki(kin);
sagyo.aft(kin, yo2);
me = me2;
yo = yo2;
} catch (Throwable t) {
// rollback
}
}
public hiki(int kin, Sagyo sagyo) {
Saifu me2 = me.clone();
Saifu yo2 = yo.clone();
try {
sagyo.pre(kin, me2);
me2.hiki(kin);
sagyo.cur(kin, me2, yo2);
yo2.nyu(kin);
sagyo.aft(kin, yo2);
me = me2;
yo = yo2;
} catch (Throwable t) {
// rollback
}
}
public static interface Sagyo {
void pre(int kin, Saifu x) throws
SaifuException;
void cur(int kin, Saifu x, Saifu
y) throws SaifuException;
void aft(int kin, Saifu y) throws
SaifuException;
}
public static class SagyoAdapta implements
Sagyo {
void pre(Saifu x) throws
SaifuException {
}
void cur(int kin, Saifu x, Saifu
y) throws SaifuException {
}
void aft(int kin, Saifu y) throws
SaifuException {
}
}
public static class SaifuException extends
RuntimeException {
public SaifuException(String m) {
super(m);
}
}
public static class CurrentWorker extends
SagyoAdapta {
@override
public void cur(int kin, Saifu x,
Saifu y) throws SaifuException {
if (x.zan < 80)
throw new
SaifuException("(:-");
if (y.zan > 800)
throw new
SaifuException("^^;;");
}
}
public static void main(String[] args) {
SafeSaifu ss = new SafeSaifu(new
Saifu(100), new Saifu(500));
ss.nyu(150, new CurrentWorker());
}
}
こんなのでどうでしょうか。