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