以下のデザインはあなたによく見えますか?それはデザインパターンですか?リファクタリングが必要だと思うなら、それをどのように改善しますか?コードでこのデザインは意味がありますか?
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
をアップキャストする必要があり、あなたはそれが正しいことだと思いますか?
編集: エリート紳士の質問に答えるために、私はReqeust
が単純な文字列以外の型が必要であることを示すために私のコードを変更しました。
PaymentServer
のgetResponse()
はまだ「醜い」のように見えますか?どのように私はそれを再調整するのですか?
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 ...宿題タグを追加しましたか?実際のプロジェクトを模擬するためにダミーのクラスを作った。 – sarahTheButterFly