首页 > 代码库 > 设计模式 - 代理模式(proxy pattern) 未使用代理模式 详解

设计模式 - 代理模式(proxy pattern) 未使用代理模式 详解

代理模式(proxy pattern) 未使用代理模式 详解


本文地址: http://blog.csdn.net/caroline_wendy


部分代码参考: http://blog.csdn.net/caroline_wendy/article/details/37698747


如果需要监控(monitor)类的某些状态, 则需要编写一个监控类, 并同过监控类进行监控.

但仅仅局限于本地, 如果需要远程监控, 则需要使用代理模式(proxy pattern).


具体方法:

1. 类中需要提供状态信息, 并提供一些get方法, 进行调用.

/**
 * @time 2014年7月11日
 */
package proxy;

/**
 * @author C.L.Wang
 *
 */
public class GumballMachine {

	String location; //位置信息
	
	State soldOutState;
	State noQuarterState;
	State hasQuarterState;
	State soldState;
	State winnerState;
	
	State state = soldOutState;
	int count = 0;
	
	/**
	 * 
	 */
	public GumballMachine(String location, int numberGumballs) {
		// TODO Auto-generated constructor stub
		soldOutState = new SoldOutState(this);
		noQuarterState = new NoQuarterState(this);
		hasQuarterState = new HasQuarterState(this);
		soldState = new SoldState(this);
		winnerState = new WinnerState(this);
		
		this.location = location;
		
		this.count = numberGumballs;
		if (numberGumballs > 0) {
			state = noQuarterState;
		}
	}
	
	public void insertQuarter() {
		state.insertQuarter();
	}
	
	public void ejectQuarter() {
		state.ejectQuater();
	}

	public void turnCrank() {
		state.turnCrank();
		state.dispense();
	}
	
	public void setState(State state) {
		this.state = state;
	}
	
	public void releaseBall() {
		System.out.println("A gumball comes rolling out the slot...");
		if (count != 0)
			count --;
	}
	
	public int getCount() {
		return count;
	}
	
	public void refill(int count) {
		this.count = count;
		state = noQuarterState;
	}
	
	public State getState() {
		return state;
	}
	
	public String getLocation() {
		return location;
	}
	
	public State getSoldOutState() {
		return soldOutState;
	}
	
	public State getNoQuarterState() {
		return noQuarterState;
	}
	
	public State getHasQuarterState() {
		return hasQuarterState;
	}
	
	public State getSoldState() {
		return soldState;
	}
	
	public State getWinnerState() {
		return winnerState;
	}
	
	public String toString() {
		StringBuffer result = new StringBuffer();
		result.append("\nMighty Gumball, Inc.");
		result.append("\nJava-enabled Standing Gumball Model #2004\n");
		result.append("Inventory: " + count + " gumball");
		if (count != 1) {
			result.append("s");
		}
		result.append("\nMachine is " + state + "\n");
		return result.toString();
	}
}

2. 监控类(monitor class), 调用get方法, 进行监控输出.

/**
 * @time 2014年7月12日
 */
package proxy;

/**
 * @author C.L.Wang
 *
 */
public class GumballMonitor {

	GumballMachine machine;
	
	/**
	 * 
	 */
	public GumballMonitor(GumballMachine machine) {
		// TODO Auto-generated constructor stub
		this.machine = machine;
	}
	
	public void report() {
		System.out.println("Gumball Machine: " + machine.getLocation());
		System.out.println("Current inventory: " + machine.getCount() + " gumballs.");
		System.out.println("Current state: " + machine.getState());
	}

}

3. 其余代码参考: http://blog.csdn.net/caroline_wendy/article/details/37698747


4. 测试类, 实例化具体类, 并使用监控类, 进行监控.

/**
 * @time 2014年7月11日
 */
package proxy;

/**
 * @author C.L.Wang
 *
 */
public class GumballMachineTestDrive {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		GumballMachine gumballMachine = new GumballMachine("Seattle", 115);
		GumballMonitor gumballMonitor = new GumballMonitor(gumballMachine);
		gumballMonitor.report();
	}

}

5. 输出:

Gumball Machine: Seattle
Current inventory: 115 gumballs.
Current state: waiting for quater