【发布时间】:2014-10-22 03:42:30
【问题描述】:
我曾多次遇到过以特定方式对对象进行编码可能会导致其处于不一致状态的情况。一个例子是question。
来自答案:使用装饰器模式来构造对象是不好的,因为它会使对象处于不一致的状态。
谁能通过一个例子向我解释一下,一个对象处于不一致状态的真正含义是什么?
【问题讨论】:
我曾多次遇到过以特定方式对对象进行编码可能会导致其处于不一致状态的情况。一个例子是question。
来自答案:使用装饰器模式来构造对象是不好的,因为它会使对象处于不一致的状态。
谁能通过一个例子向我解释一下,一个对象处于不一致状态的真正含义是什么?
【问题讨论】:
考虑下面的类,它是InputStream 的装饰器类。这里close() 方法没有实现。
现在,如果我创建这个类的一个对象并在其上调用close(),我的假设是流已经关闭,但实际上,由于装饰器中未完全实现方法close(),它并没有关闭类。
public class UnClosableDecorator extends InputStream {
private final InputStream inputStream;
public UnClosableDecorator(InputStream inputStream) {
this.inputStream = inputStream;
}
@Override
public int read() throws IOException {
return inputStream.read();
}
@Override
public int read(byte[] b) throws IOException {
return inputStream.read(b);
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
return inputStream.read(b, off, len);
}
@Override
public long skip(long n) throws IOException {
return inputStream.skip(n);
}
@Override
public int available() throws IOException {
return inputStream.available();
}
@Override
public synchronized void mark(int readlimit) {
inputStream.mark(readlimit);
}
@Override
public synchronized void reset() throws IOException {
inputStream.reset();
}
@Override
public boolean markSupported() {
return inputStream.markSupported();
}
@Override
public void close() throws IOException {
//do nothing
}
}
【讨论】: