[英]What is the ISubject and Operation() of the code in proxy design pattern?
我想知道使用以下代碼的含義是什么:1. ISubject和Operation()2. realSubject:RealSubject和3.代理設計模式的UML圖上的Operation()realSubject.Operation()
//Payment.java
import java.math.*; import java.rmi.*;
public interface Payment extends Remote{
public void purchase(PaymentVO payInfo, BigDecimal price)
throws PaymentException, RemoteException; }`
//PaymentProxy.java
import java.net.*;
import java.math.*;
import java.rmi.*;
public class PaymentProxy implements PaymentService{
private Payment implementation;
private String serviceMachine = "localhost";
private String serviceName = "paymentService";
public PaymentProxy() throws ServiceUnavailableException{
lookupRemoteService();
}
private void lookupRemoteService() throws ServiceUnavailableException{
try{
String url = "//" + serviceMachine + "/" + serviceName;
Object lookup = Naming.lookup(url);
if (lookup instanceof Payment){
implementation = (Payment)lookup;
}
else{
throw new ServiceUnavailableException("Cannot locate remote service");
}
}
catch (RemoteException exc){
throw new ServiceUnavailableException("Error during remote service lookup", exc);
}
catch (NotBoundException exc){
throw new ServiceUnavailableException("Remote service is not registered with naming server", exc);
}
catch (MalformedURLException exc){
throw new ServiceUnavailableException("Malformed URL for naming lookup", exc);
}
}
public void setServiceMachine(String machineName){
serviceMachine = machineName;
}
public void setServiceName(String svcName){
serviceName = svcName;
}
public void purchase(PaymentVO pay, BigDecimal price) throws PaymentException, ServiceUnavailableException{
try{
if (implementation != null){
implementation.purchase(pay, price);
}
}
catch (RemoteException exc){
try{
lookupRemoteService();
implementation.purchase(pay, price);
}
catch (RemoteException exc2){
throw new PaymentException("Cannot process payment: remote communication problems with payment service", exc2);
}
}
}
}`
//PaymentImpl.java
import java.math.*;
import java.net.*;
import java.rmi.*;
import java.rmi.server.*;
public class PaymentImpl implements Payment{
private static final String PAYMENT_SERVICE_NAME = "paymentService";
public PaymentImpl() throws RemoteException, MalformedURLException{
UnicastRemoteObject.exportObject(this);
Naming.rebind(PAYMENT_SERVICE_NAME, this);
}
public void purchase(PaymentVO payInfo, BigDecimal price)
throws PaymentException{
}
}`
該PaymentProxy
應該實現Payment
,而不是PaymentService
:
public class PaymentProxy implements Payment {
在這種情況下:
Payment
是ISubject
; PaymentImpl
是RealSubject
(以便implementation
在PaymentProxy
是realSubject
字段); RealSubject
purchase()
方法對應於RealSubject
Operation()
。 更可靠的解釋:
這兩個類都實現了Payment
接口。 此外,它們每個都覆蓋了purchase()
方法。 但PaymentProxy
是包裝 ,因為它聚合PaymentImpl
,並在覆蓋方法增加了空檢查:
public void purchase(PaymentVO pay, BigDecimal price) throws PaymentException, ServiceUnavailableException, RemoteException{
if (implementation != null){
implementation.purchase(pay, price);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.