디자인 모드 학습 -- 프 록 시 모드 (프 록 시 패턴)
12477 단어 디자인 모드
개술
———————————————————————————————————————————————————
프 록 시 모드 - 다른 대상 에 게 대역 이나 자리 표시 자 를 제공 하여 이 대상 에 접근 합 니 다.
OO 원칙
———————————————————————————————————————————————————
———————————————————————————————————————————————————
예: 원 격 제어 가 가능 한 사탕 기계 구현
———————————————————————————————————————————————————
코드 의 변 화 는 '상태 모드' 라 는 블 로 그 를 대조 할 수 있다.
프 록 시 모드 는 쉽게 이해 되 지 않 으 니 잘 소개 해 야 합 니 다.
원 격 에이전트 역할
원 격 에이 전 트 는 '원 격 대상 의 로 컬 대표' 와 같다.무엇 을 '원 격 대상' 이 라 고 합 니까?이것 은 서로 다른 자바 가상 컴퓨터 더미 에서 사 는 대상 이다.무엇 을 '현지 대표' 라 고 합 니까?이것 은 로 컬 방법 으로 호출 할 수 있 는 대상 으로 그 행 위 는 원 격 대상 에 전 달 될 것 이다.
쉽게 말 하면 대 리 는 로 컬 대상 으로 고객 이 직접 접촉 하 는 대상 이다. 그러나 이 로 컬 대상 은 진정한 원 격 대상 과 소통 하고 원 격 대상 은 요청 한 결 과 를 대리 에 게 되 돌려 주 고 대리 가 결 과 를 고객 에 게 되 돌려 준다.이것 은 원 격 제어 의 전체 절차 다.
이 예 에서 사탕 기계 가 맡 은 역할 은 진정한 원 격 대상 이 고 대리 서비스의 대상 이다.프 록 시 는 모니터 를 통 해 원 격 서버 에 등록 해서 되 돌려 받 아야 합 니 다.자바 의 RMI (원 격 방법 호출) 와 관련 된 것 으로 디자인 모델 의 내용 이 아니 라 더 이상 말 하지 않 습 니 다.
우리 가 알 아야 할 것 은 대리 대상 은 RMI Registry 를 통 해 얻 은 것 이다. 이것 은 stub (말뚝) 이 라 고 하 는데 stub 는 고객 보조 대상 을 맡 고 실제 고객 더미 에 있다. 그러나 자바 RMI 에서 서버 더미 에 있 는 skeleton (골격) 은 서비스 보조 대상 이다.
잘 보 실 수 있 을 지 모 르 겠 지만 사실은 에서 매우 상세 하 게 설명 되 었 습 니 다. 그림 과 글 이 모두 훌륭 합 니 다. 몇 번 보면 원 격 대리 의 작업 절차 가 어떤 지 이해 할 수 있 을 것 입 니 다.
사탕 기계 의 원 격 대리 실현 을 살 펴 보 겠 습 니 다.
클 라 이언 트 에:
GumballMonitor: 이것 은 우리 의 모니터 코드 입 니 다. 원 격 사탕 기계 와 대 리 를 사용 하여 소통 합 니 다.
GumballStub: 저희 대리 입 니 다.
서버 쪽:
Gumball Skeleton: 이것 은 우리 의 서버 보조 대상 인 Gumball Machine 입 니 다. 이것 은 우리 의 서비스 대상 입 니 다. 이것 은 고객 에 게 원 격 인 터 페 이 스 를 노출 시 켜 사용 할 수 있 습 니 다.
GumballMachine 을 원 격 서비스 로 준비 하도록 하 세 요.
GumabllMachine 원 격 인터페이스
package gumballrmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* GumballMachine
* @author wwj
*
*/
public interface GumballMachineRemote extends Remote {
public int getCount() throws RemoteException;
public String getLocation() throws RemoteException;
public State getState() throws RemoteException;
}
상태 인터페이스 수정
package gumballrmi;
import java.io.*;
/**
* 2013/7/13
* @author wwj
* Serializable , State
*/
public interface State extends Serializable {
public void insertQuarter();
public void ejectQuarter();
public void turnCrank();
public void dispense();
}
수정 상태 구현 클래스
package gumballrmi;
public class NoQuarterState implements State {
// State , GumballMachine transient , JVM
transient GumballMachine gumballMachine;
public NoQuarterState(GumballMachine gumballMachine) {
this.gumballMachine = gumballMachine;
}
public void insertQuarter() {
System.out.println("You inserted a quarter");
gumballMachine.setState(gumballMachine.getHasQuarterState());
}
public void ejectQuarter() {
System.out.println("You haven't inserted a quarter");
}
public void turnCrank() {
System.out.println("You turned, but there's no quarter");
}
public void dispense() {
System.out.println("You need to pay first");
}
public String toString() {
return "waiting for quarter";
}
}
HasQuarterState.java
package gumballrmi;
import java.util.Random;
public class HasQuarterState implements State {
Random randomWinner = new Random(System.currentTimeMillis()); //
transient GumballMachine gumballMachine;
public HasQuarterState(GumballMachine gumballMachine) {
this.gumballMachine = gumballMachine;
}
public void insertQuarter() {
System.out.println("You can't insert another quarter");
}
public void ejectQuarter() {
System.out.println("Quarter returned");
gumballMachine.setState(gumballMachine.getNoQuarterState());
}
public void turnCrank() {
System.out.println("You turned...");
int winner = randomWinner.nextInt(10); // 0~10
if((winner == 0) && (gumballMachine.getCount() > 1)) { // 0, ,
gumballMachine.setState(gumballMachine.getWinnerState());
} else {
gumballMachine.setState(gumballMachine.getSoldState());
}
}
public void dispense() {
System.out.println("No gumball dispensed");
}
public String toString() {
return "waiting for turn of crank";
}
}
SoldOutState.java
package gumballrmi;
public class SoldOutState implements State {
transient GumballMachine gumballMachine;
public SoldOutState(GumballMachine gumballMachine) {
this.gumballMachine = gumballMachine;
}
public void insertQuarter() {
System.out.println("You can't insert a quarter, the machine is sold out");
}
public void ejectQuarter() {
System.out.println("You can't eject, you haven't inserted a quarter yet");
}
public void turnCrank() {
System.out.println("You turned, but there are no gumballs");
}
public void dispense() {
System.out.println("No gumball dispensed");
}
public String toString() {
return "sold out";
}
}
SoldState.java
package gumballrmi;
public class SoldState implements State {
transient GumballMachine gumballMachine;
public SoldState(GumballMachine gumballMachine) {
this.gumballMachine = gumballMachine;
}
public void insertQuarter() {
System.out.println("Please wait, we're already giving you a gumball");
}
public void ejectQuarter() {
System.out.println("Sorry, you already turned the crank");
}
public void turnCrank() {
System.out.println("Turning twice doesn't get you another gumball!");
}
public void dispense() {
gumballMachine.releaseBall();
if (gumballMachine.getCount() > 0) {
gumballMachine.setState(gumballMachine.getNoQuarterState());
} else {
System.out.println("Oops, out of gumballs!");
gumballMachine.setState(gumballMachine.getSoldOutState());
}
}
public String toString() {
return "dispensing a gumball";
}
}
WinnerState.java
package gumballrmi;
public class WinnerState implements State {
transient GumballMachine gumballMachine;
public WinnerState(GumballMachine gumballMachine) {
this.gumballMachine = gumballMachine;
}
public void insertQuarter() {
System.out.println("Please wait, we're already giving you a Gumball");
}
public void ejectQuarter() {
System.out.println("Please wait, we're already giving you a Gumball");
}
public void turnCrank() {
System.out.println("Turning again doesn't get you another gumball!");
}
public void dispense() {
System.out.println("YOU'RE A WINNER! You get two gumballs for your quarter");
gumballMachine.releaseBall();
if (gumballMachine.getCount() == 0) {
gumballMachine.setState(gumballMachine.getSoldOutState());
} else {
gumballMachine.releaseBall();
if (gumballMachine.getCount() > 0) {
gumballMachine.setState(gumballMachine.getNoQuarterState());
} else {
System.out.println("Oops, out of gumballs!");
gumballMachine.setState(gumballMachine.getSoldOutState());
}
}
}
public String toString() {
return "despensing two gumballs for your quarter, because YOU'RE A WINNER!";
}
}
모니터
package gumballrmi;
import java.rmi.RemoteException;
/**
*
* @author wwj
* , 、
*
* ,
*/
public class GumballMonitor {
GumballMachineRemote gumballMachine;
public GumballMonitor(GumballMachineRemote gumballMachine) {
this.gumballMachine = gumballMachine;
}
public void report() {
try {
System.out.println("Gumball Machine: " + gumballMachine.getLocation());
System.out.println("Current inventory: " + gumballMachine.getCount() + " gumballs");
System.out.println("Current State: " + gumballMachine.getState());
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
사탕 기계
package gumballrmi;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/**
* 2013/7/13
* @author wwj
*
* :
*/
public class GumballMachine extends UnicastRemoteObject implements GumballMachineRemote{
State soldOutState; //
State noQuarterState; // 25
State hasQuarterState; // 25
State soldState; //
State winnerState; //10%
State state = soldOutState;
int count = 0;
String location; // ,
public GumballMachine(String location, int numberGumballs) throws RemoteException{
soldOutState = new SoldOutState(this);
noQuarterState = new NoQuarterState(this);
hasQuarterState = new HasQuarterState(this);
soldState = new SoldState(this);
winnerState = new WinnerState(this);
this.count = numberGumballs;
if(numberGumballs > 0) {
state = noQuarterState;
}
this.location = location;
}
public String getLocation() {
return location;
}
public void insertQuarter() {
state.insertQuarter();
}
public void ejectQuarter() {
state.ejectQuarter();
}
public void turnCrank() {
state.turnCrank();
state.dispense();
}
void setState(State state) {
this.state = state;
}
public State getState() {
return state;
}
void releaseBall() {
System.out.println("A gumball comes rolling out the slot...");
if(count != 0) {
count = count - 1;
}
}
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 int getCount() {
return count;
}
public String toString() {
StringBuffer result = new StringBuffer();
result.append("
Mighty Gumball, Inc.");
result.append("
Java-enabled Standing Gumball Model #2004");
result.append("
Inventory: " + count + " gumball");
if (count != 1) {
result.append("s");
}
result.append("
");
result.append("Machine is " + state + "
");
return result.toString();
}
}
RMI registry 에 등록...
package gumballrmi;
import java.rmi.Naming;
public class GumballMachineTestDrive {
public static void main(String[] args) {
GumballMachineRemote gumballMachine = null;
int count = 0;
if(args.length < 2) {
System.out.println("GumballMachine<name> <inventory>");
System.exit(1);
}
try {
count = Integer.parseInt(args[1]);
gumballMachine = new GumballMachine(args[0], count);
Naming.rebind("//" + args[0] + "/gumballmachine", gumballMachine);
} catch (Exception e) {
e.printStackTrace();
}
}
}
이상 은 원 격 서 비 스 를 만 드 는 절차 입 니 다.
STEP 1: 원 격 인터페이스 만 들 기
STEP 2: 원 격 실현 만 들 기
STEP 3: rmic 를 이용 한 stub 와 skeleton
STEP 4: RMI 레 지 스 트 리 시작
STEP 5: 원 격 서비스 시작
프 록 시 모드 에는 가상 에이전트 와 보호 에이전트 도 있 는데 여기 서 원 격 에이전트 만 논의 하고 비교적 많이 사용 하 는 것 이 며 다른 것 은 을 참고 할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.