Используйте какой шаблон проектирования, чтобы переписать код? - PullRequest
3 голосов
/ 04 апреля 2020

В: Для следующих фрагментов кода определите, какой шаблон проектирования должен был использоваться для улучшения качества кода. Перепишите код, используя шаблон проектирования, который вы определили. Ваш ответ должен включать: i) утверждение для описания шаблона проектирования, ii) переписанный код Java и iii) результат теста из переписанного кода Java.

public class FitnessCustomer {
 private static enum Level {
 BRONZE, SILVER, GOLD
 }
 private Level level;
public void setLevel(Level level) {
this.level = level;
}
 public double getFees() {
 switch (level) {
 case BRONZE: return CustomerConstants.BRONZE_FEES;
 case SILVER: return CustomerConstants.SILVER_FEES;
 case GOLD: return CustomerConstants.GOLD_FEES;
 }
 throw new IllegalStateException("How did I get here?");
}
 public boolean canAccessPool() {
 return (level == Level.SILVER || level == Level.GOLD);
}
 public boolean hasOwnLocker() {
 return (level == Level.GOLD);
}
 public double getEquipmentDiscount() {
 switch (level) {
 case BRONZE: return CustomerConstants.BRONZE_DISCOUNT;
 case SILVER: return CustomerConstants.SILVER_DISCOUNT;
 case GOLD: return CustomerConstants.GOLD_DISCOUNT;
 }
 throw new IllegalStateException("How did I get here?");
 }

Я свободен sh человек, который изучает шаблон проектирования и знает некоторые шаблоны, такие как шаблон наблюдения, шаблон декорирования и шаблон фабрики ... Но, если честно, я не совсем понимаю, как их идентифицировать и использовать для улучшения кодов. Что касается вопроса, я думаю, что код может быть улучшен шаблоном шаблона, потому что фитнес-клиент может быть скелетом. И BRONZE, SILVER, GOLD могут быть подклассами для фитнес-клиента. Я не уверен, что это правильно для вопроса. И коды ниже:

FitnessCustomer.class:

package ASS2_Q2;

public abstract class FitnessCustomer {
    private Level level;

    public final void setLevel(Level level){
        this.level = level
    }

    public final double getFees(){
        switch(level){
            case BRONZE: return CustomerConstants.BRONZE_FEES;
            case SILVER: return CustomerConstants.SILVER_FEES;
             case GOLD: return CustomerConstants.GOLD_FEES; 
        }
        throw new IllegalStateException("How did I get here?");
    }

    public final double getEquipmentDiscount(){
        switch(level){
            case BRONZE: return CustomerConstants.BRONZE_DISCOUNT;
            case SILVER: return CustomerConstants.SILVER_DISCOUNT;
            case GOLD: return CustomerConstants.GOLD_DISCOUNT;
        }
        throw new IllegalStateException("How did I get here?");
    }

    public abstract  boolean canAccessPool();

    public abstract boolean hasOwnLocker();


}

BRONZE.class:

package ASS2_Q2;

public class BRONZE extends FitnessCustomer{
    public BRONZE(){
        this.level = "BRONZE";
    }


    @Override
    public boolean canAccessPool(){
        return false;
    }

    @Override
    public boolean hasOwnLocker(){
        return false;
    }


}

GOLD.class:

package ASS2_Q2;

public class GOLD extends FitnessCustomer{
    public GOLD(){
        this.level = "GOLD";
    }

    @Override
    public boolean canAccessPool(){
        return true;
    }

    @Override
    public boolean hasOwnLocker(){
        return true;
    }

}

SILVER.class:

package ASS2_Q2;

public class SILVER extends FitnessCustomer{

    public SILVER(){
        this.level = "SILVER";
    }


    @Override
    public boolean canAccessPool(){
        return true;
    }

    @Override
    public boolean hasOwnLocker(){
        return false;
    }



}

Я хочу спросить, является ли ответ правильным? Пожалуйста, помогите мне! Спасибо!

1 Ответ

3 голосов
/ 04 апреля 2020

Я не использую какой-либо конкретный шаблон проектирования, но я думаю, что мы могли бы разработать его следующим образом:

Вы можете иметь следующие интерфейсы:

CustomerWithLockerAccess
CustomerWithPoolAccess
CustomerWithEquipmentDiscount

Этот интерфейс гарантирует, что мы можем иметь клиент с любыми комбинациями доступа.

Поскольку у каждого клиента есть уровень, и он должен платить за него, вы можете создать абстрактный класс FitnessCustomer следующим образом:

public abstract class FitnessCustomer {
    private static final Level level;

    public FitnessCustomer(Level level){
       this.level = level
    }

    public Level getLevel(){ return this.level};

    public final double getFees();
  }

Затем вы можете создать ваши занятия следующим образом:

GoldCustomer extends FitnessCustomer implements CustomerWithLockerAccess, CustomerWithPoolAccess, CustomerWithEquipmentDiscount


SilverCustomer extends FitnessCustomer implements CustomerWithPoolAccess, CustomerWithEquipmentDiscount

BronzeCustomer extends FitnessCustomer implements CustomerWithEquipmentDiscount
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...