State pattern
State.java
package state;
abstract public class State {
ChatClient context;
State(ChatClient context){
this.context = context;
}
void setContext(ChatClient newContext){
context = newContext;
}
abstract void write(String message);
abstract void connect(String address);
}
ConnectedState.java
package state;
public class ConnectedState extends State {
public ConnectedState(ChatClient context) {
super(context);
}
@Override
void write(String message) {
context.stream.println(message);
}
@Override
void connect(String address) {
//throw new RuntimeException("already connected");
}
}
DisconnectedState.java
package state;
public class DisconnectedState extends State {
public DisconnectedState(ChatClient context) {
super(context);
}
@Override
void write(String message) {
throw new RuntimeException("not connected");
}
@Override
void connect(String address) {
System.out.println("Connecting...");
context.stream = System.out;
context.setState(new ConnectedState(context));
}
}
ChatClient.java
package state;
import java.io.PrintStream;
public class ChatClient {
State state;
PrintStream stream;
public ChatClient(){
state = new DisconnectedState(this);
}
void setState(State newstate){
state = newstate;
}
public void write(String message){
state.write(message);
}
public void connect(){
state.connect("tady by mel byt treba hostname");
}
}
Main.java
package state;
public class Main {
public static void main(String[] args) {
ChatClient client = new ChatClient();
//zkuste client.write("ahoj");
client.connect();
client.connect();
client.write("ahoj");
}
}