java状态模式替代if else_java – instanceOf的替代方案(状态模式)

我在使用状态模式时遇到问题,我不知道如何在不使用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


版权声明:本文为weixin_42400643原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。