在開發的場景中,經常會遇到打折的業務需求,每一個用戶對應的等級,他們的打折狀況也是不同的。例如普通會員打9折,青銅會員打8.5折,黃金會員打8折等等。在通常開發中最簡單的就是判斷用戶的等級,而後對訂單做對應的打折處理。java
寫了一個簡單的小示例,以下所示:spring
//1 表明學生 2老師 3校長 int type = 1; if (1 == type) { System.out.println("學生笑嘻嘻的說話"); } else if (2 == type) { System.out.println("老師開心的說話"); } else { System.out.println("校長嚴肅的說話"); }
上面的代碼,是咱們常常的作法,代碼少的時候,看起來很是清晰,可是代碼多起來或者有了更多的判斷條件,那上面的代碼會更加的混亂,若是每次有修改,都要改動這部分代碼。框架
能夠把上面的代碼改爲多態方式,建立三個類,學生Student,老師Teacher,校長HeadMater,父類爲Person,這三個類都實現父類的方法say,以下所示:ide
Person.class測試
package me.xueyao.service; /** * @author Simon.Xue * @date 2019-12-01 14:31 **/ public interface Person { void say(); }
Student.class優化
package me.xueyao.service.impl; import me.xueyao.service.Person; import org.springframework.stereotype.Service; /** * @author Simon.Xue * @date 2019-12-01 14:34 **/ @Service public class Student implements Person { @Override public void say() { System.out.println("學生笑嘻嘻的說話"); } }
Teacher.classcode
package me.xueyao.service.impl; import me.xueyao.service.Person; import org.springframework.stereotype.Service; /** * @author Simon.Xue * @date 2019-12-01 14:37 **/ @Service public class Teacher implements Person { @Override public void say() { System.out.println("老師開心的說話"); } }
HeadMaster.class對象
package me.xueyao.service.impl; import me.xueyao.service.Person; import org.springframework.stereotype.Service; /** * @author Simon.Xue * @date 2019-12-01 14:41 **/ @Service public class HeadMaster implements Person { @Override public void say() { System.out.println("校長嚴肅的說話"); } }
測試方法開發
@Test public void testSay() { Person student = new Student(); student.say(); Person teacher = new Teacher(); teacher.say(); Person headMaster = new HeadMaster(); headMaster.say(); }
上面的這種作法,基本上是完成了優化,可是咱們還會發現了一個問題,就是每次咱們仍是要建立對應的對象。上面有三個類,咱們就要建立有三個對象,可否再次優化一下?get
由於如今項目用Sping框架,因此能夠用注入來完成優化。
首先,建立一個Person枚舉類,以下所示:
package me.xueyao.enums; import lombok.AllArgsConstructor; import lombok.Getter; import me.xueyao.service.impl.HeadMaster; import me.xueyao.service.impl.Student; import me.xueyao.service.impl.Teacher; /** * @author Simon.Xue * @date 2019-12-01 15:55 **/ @AllArgsConstructor @Getter public enum PersonEnums { STUDENT(1, "學生", Student.class), TEACHER(2, "老師", Teacher.class), HEADMASTER(3, "校長", HeadMaster.class); Integer code; String msg; Class clazz; /** * 得到類的名稱,由於Spring自動注入時,默認名稱是類名(首字母小寫) * @param code * @return */ public static String className(Integer code) { for (PersonEnums value : values()) { if (value.getCode().equals(code)) { String simpleName = value.getClazz().getSimpleName(); simpleName.substring(1); return String.valueOf(simpleName.charAt(0)).toLowerCase() + simpleName.substring(1); } } return ""; } }
使用方式 :
@Autowired private Map<String, Person> personMap = new HashMap<>(); @Test public void testSay() { personMap.get(PersonEnums.className(2)).say(); }