//
Purpose. Proxy design pattern
//
1. Create a "wrapper" for a remote, or expensive, or sensitive
target
// 2. Encapsulate the complexity/overhead of the target in the
wrapper
// 3. The client deals with the wrapper
// 4. The wrapper
delegates to the target
// 5. To support plug-compatibility of wrapper and
target, create an interface
import java.io.*; import java.net.*;
interface
SocketInterface { // 5.
To support plug-compatibility
String readLine();
// between the wrapper and
the
void writeLine( String str ); //
target, create an interface
void dispose(); }
public
class ProxyDemo {
public static
void main( String[] args ) {
SocketInterface socket = new SocketProxy( "127.0.0.1",
8189,
args[0].equals("first") ? true : false ); // 3. The client deals
String
str = null;
// with the wrapper
boolean skip = true;
while (true) {
if
(args[0].equals("second")
&& skip) skip = !
skip;
else {
str = socket.readLine();
System.out.println( "Receive
- " + str ); // java ProxyDemo
first
if
(str.equals("quit")) break; // Receive - 123 456
} // Send ---- 234
567
System.out.print(
"Send ---- " ); //
Receive - 345 678
str =
Read.aString();
//
socket.writeLine( str ); // java ProxyDemo second
if (str.equals("quit"))
break; // Send ---- 123
456
}
// Receive - 234 567
socket.dispose(); // Send ---- 345 678
} }
class SocketProxy implements
SocketInterface { // 1. Create a "wrapper" for a
private Socket socket;
// remote, or expensive,
or
private BufferedReader
in; // sensitive target
private PrintWriter out;
public SocketProxy( String host, int port, boolean wait )
{
try {
if (wait) {
ServerSocket server = new
ServerSocket( port );
socket = server.accept();
// 2. Encapsulate the complexi-
} else // ty/overhead of the target
socket = new Socket( host, port ); //
in the wrapper
in = new BufferedReader( new
InputStreamReader(
socket.getInputStream()));
out = new PrintWriter( socket.getOutputStream(), true );
} catch( IOException e ) {
e.printStackTrace(); }
}
public String readLine() {
String str = null;
try { str = in.readLine();
} catch( IOException e ) {
e.printStackTrace(); }
return
str;
}
public void writeLine( String str ) {
out.println( str ); // 4. The wrapper delegates to
the target
}
public void dispose() {
try { socket.close();
} catch( IOException e ) {
e.printStackTrace(); }
} }