[英]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.