자바 개발 의 교체

17052 단어 Java
다 중 if else 내장 방법 바 꾸 기:
  • 1. 인터페이스 레이 어 링
  • 2. 다 형
  • 3. 분기 문 대신 map 사용
  • 4. 전략 + 공장 모델
  • 아 날로 그 장면: 서로 다른 채널 유형 은 서로 다른 논리 처 리 를 사용한다.
    채널 유형: 저축 카드, 신용카드, 공중전화
    일반 구현:
     public static final String depositCard = "depositCard";
     public static final String creditCard = "creditCard ";
     public static final String OfficialAccounts = "OfficialAccounts";
    
     public void auto(String channelType) {
        if (!StringUtils.isEmpty(channelType)) {
            if (depositCard.equals(channelType)) {
                //TODO
            } else if (creditCard .equals(channelType)) {
                //TODO
            } else if (OfficialAccounts.equals(channelType)) {
                //TODO
            } else {
                //TODO
            }
         }
      }
    

    인터페이스 레이 어 링: 인터페이스 레이 어 링 은 인 터 페 이 스 를 내부 인터페이스 와 대외 인터페이스 로 나 누 어 비 어 있 는 판단 을 외부 인터페이스 에 두 고 처리 하 는 것 이다. 내부 인터페이스 에 들 어 오 는 변 수 는 외부 인터페이스 에서 비 어 있 지 않 고 2 에서 빈 값 으로 판단 하 는 것 이다.
    public static final String depositCard = "depositCard";
    public static final String creditCard = "creditCard ";
    public static final String OfficialAccounts = "OfficialAccounts";
     
    public void auto(String channelType) {
        if (!StringUtils.isEmpty(channelType)) {
            autoImpl(channelType);
        }
    }
    
    private void autoImpl(String channelType) {
    	  if (depositCard.equals(channelType)) {
    	      //TODO
    	  } else if (creditCard .equals(channelType)) {
    	      //TODO
    	  } else if (OfficialAccounts.equals(channelType)) {
    	      //TODO
    	  } else {
    	      //TODO
    	  }
    }
    

    다 중 구현:
    public abstract class Channel {
        public String type;
        public Channel(String type) {
            this.type = type;
        }
        public abstract void auto();
    }
    
    public class DepositCardChannel extends Channel {
        public DepositCardChannel(String type) {
            super(type);
        }
        @Override
        public void auto() {
            System.out.println("This is DepositCardChannel");
        }
    }
    
    public class CreditCardChannel extends Channel {
        public CreditCardChannel(String type) {
            super(type);
        }
        @Override
        public void auto() {
            System.out.println("This is CreditCardChannel");
        }
    }
    
    public void auto(Policy policy) {
        if (policy != null) {
            autoImpl(policy);
        }
    }
    public void autoImpl(Policy policy) {
        policy.auto();
    }
    

    자, if else 하나 도 없습니다. 새로운 유형 이 있 으 면 하나의 계승 채널 만 추가 하면 됩 니 다.
    분기 문 대신 맵 사용 하기:
    private static Map<String, Class<? extends Policy>> map         = new HashMap<>();
    
    public static final String   OPEN_POLICY = "OpenPolicy";
    public static final String    SUB_POLICY  = "SubPolicy";
    
    static {
        map.put(OPEN_POLICY, OpenPolicy.class);
        map.put(SUB_POLICY, SubPolicy.class);
    }
    
    public void auto(String policyType) {
        try {
            Class<? extends Policy> clazz = map.get(policyType);
            clazz.newInstance().auto();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
    

    좋은 웹페이지 즐겨찾기