我想知道使用下面代码的基础是什么: 1. ISubject和Operation() 2. realSubject:RealSubject和 3.操作() realSubject.Operation() 在代理设计模式的UML图上
//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{
}
}`
答案 0 :(得分:0)
PaymentProxy
应该实现Payment
而不是PaymentService
:
public class PaymentProxy implements Payment {
在这种情况下:
Payment
是ISubject
; PaymentImpl
为RealSubject
(因此implementation
中的PaymentProxy
是realSubject
字段); purchase()
方法与Operation()
中的RealSubject
对应。更有力的解释:
Payment
接口由两个类实现。此外,它们中的每一个都会覆盖purchase()
方法。但是PaymentProxy
是包装器,因为它聚合PaymentImpl
并在重写方法中添加空检查:
public void purchase(PaymentVO pay, BigDecimal price) throws PaymentException, ServiceUnavailableException, RemoteException{
if (implementation != null){
implementation.purchase(pay, price);
}
}