디자인 모드 학습 -- 프 록 시 모드 (프 록 시 패턴)

12477 단어 디자인 모드
디자인 모드 학습 -- 프 록 시 모드 (프 록 시 패턴)
개술
———————————————————————————————————————————————————
프 록 시 모드 - 다른 대상 에 게 대역 이나 자리 표시 자 를 제공 하여 이 대상 에 접근 합 니 다.
OO 원칙
———————————————————————————————————————————————————
  • 패 키 징 변화
  • 다 용도 조합, 소 용도 계승
  • 인터페이스 프로 그래 밍 에 대해 프로 그래 밍 을 실현 하지 않 음
  • 상호작용 대상 간 의 소나무 결합 디자인 을 위해 노력
  • 클래스 는 확장 에 개방 하고 수정 에 대해 닫 아야 합 니 다
  • 추상 에 의존 하고 구체 적 인 유형
  • 이 필요 하지 않다.
  • 친구 와 만 이야기 하기
  • 날 찾 지 마. 내 가 찾 을 게
  • 류 는 변 하 는 이유 가 하나 밖 에 없어 야 한다
  • 요점
    ———————————————————————————————————————————————————
  • 대리 모델 은 다른 대상 에 게 대 표를 제공 하여 고객 이 대상 에 대한 방문 을 통제 하고 방문 을 관리 하 는 방식 이 여러 가지 가 있다.
  • 원 격 대리 관리 고객 과 원 격 대상 간 의 상호작용.
  • 가상 에이전트 가 방문 사례 화 비용 이 많은 대상 을 제어 한다.
  • 호출 자 제어 대상 방법 에 대한 접근 을 보호 합 니 다.
  • 프 록 시 모드 는 캐 시 에이전트, 동기 에이전트, 방화벽 에이전트 와 기록 할 때 복사 에이전트 등 여러 가지 변형 이 있 습 니 다.
  • 대 리 는 구조 적 으로 장식 자 와 유사 하지만 목적 은 다르다.
  • 장식 자 모델 은 대상 에 행 위 를 더 하고 대 리 는 방문 을 통제 하 는 것 이다.
  • 자바 에 내 장 된 프 록 시 지원 은 필요 에 따라 동적 프 록 시 를 만 들 고 선택 한 프로세서 에 모든 호출 을 할당 할 수 있 습 니 다.
  • 다른 포장 자 (wrapper) 와 마찬가지 로 대 리 는 디자인 의 유형 을 증가 시 킬 수 있 습 니 다.

  • 예: 원 격 제어 가 가능 한 사탕 기계 구현
    ———————————————————————————————————————————————————
    코드 의 변 화 는 '상태 모드' 라 는 블 로 그 를 대조 할 수 있다.
    프 록 시 모드 는 쉽게 이해 되 지 않 으 니 잘 소개 해 야 합 니 다.
    원 격 에이전트 역할
    원 격 에이 전 트 는 '원 격 대상 의 로 컬 대표' 와 같다.무엇 을 '원 격 대상' 이 라 고 합 니까?이것 은 서로 다른 자바 가상 컴퓨터 더미 에서 사 는 대상 이다.무엇 을 '현지 대표' 라 고 합 니까?이것 은 로 컬 방법 으로 호출 할 수 있 는 대상 으로 그 행 위 는 원 격 대상 에 전 달 될 것 이다.
    쉽게 말 하면 대 리 는 로 컬 대상 으로 고객 이 직접 접촉 하 는 대상 이다. 그러나 이 로 컬 대상 은 진정한 원 격 대상 과 소통 하고 원 격 대상 은 요청 한 결 과 를 대리 에 게 되 돌려 주 고 대리 가 결 과 를 고객 에 게 되 돌려 준다.이것 은 원 격 제어 의 전체 절차 다.
    이 예 에서 사탕 기계 가 맡 은 역할 은 진정한 원 격 대상 이 고 대리 서비스의 대상 이다.프 록 시 는 모니터 를 통 해 원 격 서버 에 등록 해서 되 돌려 받 아야 합 니 다.자바 의 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: 원 격 서비스 시작
    프 록 시 모드 에는 가상 에이전트 와 보호 에이전트 도 있 는데 여기 서 원 격 에이전트 만 논의 하고 비교적 많이 사용 하 는 것 이 며 다른 것 은 을 참고 할 수 있다.

    좋은 웹페이지 즐겨찾기