使用コードを書き換えるためのデザインパターン?

ラング佗:

Q:次のコードスニペットでは、デザインパターンは、コードの品質を向上させるために使用されているべきかを識別します。あなたが特定されてきたことを、デザインパターンを使用してコードを書き直し。あなたの答えは、ⅰ)デザインパターン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?");
 }

私は、デザインパターンを研究するために、新鮮な男だ、といくつかのパターンが好きで、飾る、パターン、工場パターンObserverパターンを知っている...しかし、正直なところ、私は実際にコードを改善するために、それらを識別し、使用方法を理解していませんよ。質問のために、私はコードを骨格とすることができ、トレーニング、顧客原因テンプレートパターンによって改善することができると思います。そして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;
    }



}

私は答えが正しいかどうかをお聞きしたいですか?私を助けてください!ありがとう!

タルン:

私は特定のデザインパターンを使用していないが、私たちは次のようにそれを設計することができると思います:

あなたは、次のインタフェースを持つことができます。

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

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=404132&siteId=1