Подходит ли дизайн ниже для вас? Это шаблон дизайна? Как бы вы улучшили его, если считаете, что он нуждается в рефакторинге?Имеет ли смысл этот дизайн?
public class FruitFetcher {
public static void main(String[] args) {
FruitFetcher fetcher = new FruitFetcher();
Apple apple = (Apple) fetcher.fetch(new FetchAppleRequest());
}
public Fruit fetch(FetchFruitRequest request){
Fruit fruit = null;
if(request.getFruitName().equals(FetchAppleRequest.REQUEST_NAME)){
fruit = new Apple();
}else if (request.getFruitName().equals(FetchBananaRequest.REQUEST_NAME)){
fruit = new Banana();
}
return fruit;
}
}
abstract class FetchFruitRequest{
abstract public String getFruitName();
}
class FetchAppleRequest extends FetchFruitRequest{
static String REQUEST_NAME = "Fetch_Apple";
@Override
public String getFruitName() {
return REQUEST_NAME;
}
}
class FetchBananaRequest extends FetchFruitRequest{
static String REQUEST_NAME = "Fetch_Banana";
@Override
public String getFruitName() {
return REQUEST_NAME;
}
}
class Fruit {
}
class Apple extends Fruit{
}
class Banana extends Fruit{
}
В коде, клиенты FruitFetcher
нужно преобразовывать Fruit
к правильному типу, как вы думаете, что это правильно?
Edit: ответить на вопрос Elite Gentleman, я изменил мой код, чтобы показать, что Reqeust
нужен тип, отличный от простого String.
Получает getResponse()
в PaymentServer
все еще выглядит «уродливым»? Как мне перефразировать его?
public class PaymentServer {
public static void main(String[] args) {
PaymentServer server = new PaymentServer();
//set pin
SetPinResponse setPinResponse = (SetPinResponse) server.getResponse(new SetPinRequest("aPin"));
System.out.println(setPinResponse.isSuccess());
//make payment
MakePaymentResposne makePaymentResponse = (MakePaymentResposne) server.getResponse(new MakePaymentRequest(new Money("5.00)"),"aPin"));
System.out.println(makePaymentResponse.isSuccess());
}
public Response getResponse(Request request){
Response aResponse = null;
if(request.getRequestName().equals(SetPinRequest.REQUEST_NAME)){
aResponse = new SetPinResponse();
}else if (request.getRequestName().equals(MakePaymentRequest.REQUEST_NAME)){
aResponse = new MakePaymentResposne();
}
return aResponse;
}
}
abstract class Request{
abstract public String getRequestName();
}
class SetPinRequest extends Request{
static String REQUEST_NAME = "Set_Pin";
private String pin;
SetPinRequest(String pin){
this.pin = pin;
}
@Override
public String getRequestName() {
return REQUEST_NAME;
}
boolean setPin(){
//code to set pin
return true;
}
}
class MakePaymentRequest extends Request{
static String REQUEST_NAME = "Make_Payment";
private Money amount;
private String pin;
MakePayment(Money amount, String pin){
this.amount = amount;
this.pin = pin;
}
@Override
public String getRequestName() {
return REQUEST_NAME;
}
}
abstract class Response {
abstract protected boolean isSuccess();
}
class SetPinResponse extends Response{
@Override
protected boolean isSuccess() {
return true;
}
}
class MakePaymentResposne extends Response{
@Override
protected boolean isSuccess() {
return false;
}
}
Спасибо,
Сара
Благодарим Павла за редактирование. – sarahTheButterFly
Почему домашняя бирка? Кажется, что самообучение выучить Java для меня. –
haha..who добавил тег домашней работы? Я сделал фиктивные классы, чтобы высмеять реальный проект на работе. – sarahTheButterFly