我在使用状态模式时遇到问题,我不知道如何在不使用instanceOf的情况下检查状态是否属于某个实例(因为这被认为是一种不好的做法).
TCPConnection包含TCPState对象.
假设我想获得所有具有TCPEstablished状态的TCPConnections.我该怎么做?
一种方式是:
public List getAllEstablished() {
List list = new ArrayList();
for(TCPConnection tcp : allConnections) {
if(tcp.getState().instanceOf(TCPEstablished)) {
list.add(tcp);
}
}
return list;
}
但是这使用了instanceOf,我宁愿不使用它.有没有更好的方法?或者我对instanceOf的使用是否有效?
解决方法:
是的,使用instanceOf被认为是一种气味.此外,检查状态对象的类型与状态模式本身的想法相反(在子类型中封装依赖于状态的行为,使得这种检查变得不必要).
然而,你可以通过向TCPState添加另一个操作来技术上摆脱instanceOf,例如bool isEstablished(),并实现它,使其仅在TCPEstablished上返回true.
interface TCPState {
...
boolean isEstablished();
}
class TCPEstablished implements TCPState {
...
boolean isEstablished() {
return true;
}
}
class TCPClosed implements TCPState {
...
boolean isEstablished() {
return false;
}
}
将操作添加到TCPConnection:
class TCPConnection {
...
boolean isEstablished() {
return this.getState().isEstablished();
}
}
然后你的操作getAllEstablished看起来像这样:
List getAllEstablished() {
List list = new ArrayList();
for(TCPConnection tcp : allConnections) {
if(tcp.isEstablished()) {
list.add(tcp);
}
}
return list;
}
instanceOf消失了.但是这值得吗?
标签:java,design-patterns,instanceof,state
来源: https://codeday.me/bug/20190528/1170771.html