디자인 모델 의 - (1) 간단 한 공장 모델 | 전략 모델

글 목록
  • 단순 공장 모델
  • 단순 공장 준비
  • 우리 공장 테스트
  • 장점
  • 전략 모드
  • 전략의 디자인
  • 테스트 코드
  • 최적화: 간단 한 공장 모델 과 전략 모델 의 결합
  • 총화
  • 최근 프로젝트 가 수요 변화 에 직면 했 을 때 대량의 코드 를 바 꿔 야 한 다 는 고민 코드 가 좋 은 것 이 아니 라 bug 를 쓰 는 것 을 거절 합 니 다!!그래서 < > 를 배우 고 우수한 코드 를 쓰 는 데 힘 쓰 겠 습 니 다. 여기 서 간단하게 학습 기록 을 작성 하 겠 습 니 다.
    단순 공장 모드
    → 업그레이드 판 공장 방법 모델 안내
    정의: 용기 가 누 구 를 예화 해 야 하 는 지, 앞으로 예화 대상 을 증가 시 킬 수 있 는 지, 모두 변화 하기 쉬 운 곳 이 므 로 독립 된 클래스 로 인 스 턴 스 를 만 드 는 곳 을 고려 해 야 합 니 다. 이것 이 바로 공장 입 니 다.
    정 의 는 영원히 정의 일 뿐 이해 하기 어렵 습 니 다. 직접 한 번 실현 하 는 것 이 야 말로 정 도 를 배 우 는 것 입 니 다. 아래 에 코드 를 직접 붙 입 니 다.
    수요: 사용자 가 두 개의 숫자 와 한 기 호 를 입력 하고 기호의 연산 을 하 며 결과 변경 점 을 출력 합 니 다. 루트 연산 이 추가 되면 어떻게 처리 합 니까?
    간단 한 공장 을 위해 준비 하 다.
    우선 두 숫자 에 대해 일정한 조작 을 하 는 것 이 필요 하 다. 그러면 우 리 는 먼저 조작 류 를 정의 한다.
    public class Operation {
    
    	//    get,set     
        private double numA = 0;
        private double numB = 0;
    
    	//              
        public double getRes() throws Exception {
            double res = 0;
            return res;
        }
        
    }
    

    그 다음 에 모든 조작 에 대해 하위 클래스 를 쓰 고 계산 방법 을 다시 써 야 한다.
    public class OperateSub extends Operation {
    
        public double getRes() {
            double res = getNumA() - getNumB();
            return res;
        }
    
    }
    
    public class OperateAdd extends Operation {
    
        public double getRes() {
            double res = getNumA() + getNumB();
            return res;
        }
    
    }
    
    public class OperateMul extends Operation {
    
        public double getRes() {
            double res = getNumA() * getNumB();
            return res;
        }
    }
    
    public class OperateDiv extends Operation {
    
        public double getRes() throws Exception {
            if (getNumB() == 0) {
                throw new Exception("     0");
            }
            double res = getNumA() / getNumB();
            return res;
        }
    }
    

    마지막 으로 저희 공장 류 를 쓰 겠 습 니 다.
    public class OperationFactory {
    
        public static Operation createOperation(String operate) {
            Operation oper = null;
            if ("+".equals(operate)) {
                oper = new OperateAdd();
            } else if ("-".equals(operate)) {
                oper = new OperateSub();
            } else if ("*".equals(operate)) {
                oper = new OperateMul();
            } else if ("/".equals(operate)) {
                oper = new OperateDiv();
            } else {
                //         ,    OperateRoot 
                //   Operation   getRes()  
                //          
            }
            return oper;
        }
    
    }
    

    우리 공장 을 테스트 하 다.
    public static void main(String[] args) {
    
            try {
                Scanner scan = new Scanner(System.in);
    
                System.out.println("     a:");
                String strNumA = scan.nextLine();
    
                System.out.println("      :");
                String strOperate = scan.nextLine();
    
                System.out.println("     b:");
                String strNumB = scan.nextLine();
    
                Operation oper = null;
                oper = OperationFactory.createOperation(strOperate);
    
                oper.setNumA(Double.parseDouble(strNumA));
                oper.setNumB(Double.parseDouble(strNumB));
                System.out.println(oper.getRes());
    
            } catch (Exception e) {
                System.out.println("      ");
                e.printStackTrace();
            }
    
        }
    

    장점.
    패 키 징 을 통 해 저도 잘 모 르 겠 습 니 다. 스스로 깨 달 으 세 요. 코드 간 의 결합 도 를 낮 추 는 것 일 수도 있 습 니 다. 호출 자 는 더 이상 어떤 인 스 턴 스 를 만 드 는 지 에 관심 을 가 질 필요 가 없습니다. (이 단 계 는 공장 에 맡 겨 완성 합 니 다) 다른 계산 방법 을 추가 하면 호출 자 는 변경 할 필요 가 없고 새로 추 가 된 논리 도 원래 의 논리 에 영향 을 주지 않 습 니 다.
    전략 모드
    정의: 알고리즘 가족 을 정의 하고 각각 패키지 하여 서로 바 꿀 수 있 도록 합 니 다. 이 모델 은 알고리즘 의 변 화 를 알고리즘 을 사용 하 는 고객 에 게 영향 을 주지 않 습 니 다.
    분석 과정 에서 서로 다른 시간 에 서로 다른 업무 규칙 을 응용 해 야 한 다 는 것 을 들 으 면 전략 모델 로 이런 변 화 를 처리 할 가능성 을 고려 할 수 있다.
    수요: 백화점 수금 소프트웨어, 구 매 상품 의 단가 와 수량 에 따라 요금 정보 변화 점 을 표시 합 니 다. 나중에 할인 기능 이 추가 되면 만 감 기능 을 추가 하면 실제 비용 을 계산 하 는 정 보 를 어떻게 실현 해 야 합 니까?
    전략 적 설계
    목적: 서로 다른 알고리즘 을 사용 하여 미수 총액 에 따라 실제 비용 을 받 아야 합 니 다.
    먼저 인 터 페 이 스 를 정의 하려 면 현금 을 계산 하 는 기능 이 필요 하 다.
    public interface CashSuper {
    
        double acceptCash(double money);
    
    }
    

    그 다음 에 각 알고리즘 류 를 실현 하고 인 터 페 이 스 를 실현 한다.
    //     
    public class CashNormal implements CashSuper {
    
        @Override
        public double acceptCash(double money) {
            return money;
        }
    
    }
    
    //   
    public class CashRebate implements CashSuper {
    
        private double moneyRebate = 0;
    
        public CashRebate(double moneyRebate) {
            this.moneyRebate = moneyRebate;
        }
    
        @Override
        public double acceptCash(double money) {
            return money * moneyRebate;
        }
    }
    
    //   
    public class CashReturn implements CashSuper {
    
        private double moneyCondition = 0;
        private double moneyReturn = 0;
    
        public CashReturn(double moneyCondition, double moneyReturn) {
            this.moneyCondition = moneyCondition;
            this.moneyReturn = moneyReturn;
        }
    
        @Override
        public double acceptCash(double money) {
            double res = money;
    
            if (money >= moneyCondition) {
                res = money - Math.floor(money / moneyCondition) * moneyReturn;
            }
    
            return res;
        }
    }
    

    상하 문 클래스 구현, 유지보수 정책 사용
    public class CashContext {
    
        private CashSuper cs;
    
        public CashContext(CashSuper cs) throws Exception {
    		this.cs = cs;
        }
    
        public double getResult(double money) {
            return cs.acceptCash(money);
        }
    
    }
    

    테스트 코드
    public static void main(String[] args) throws Exception {
    
            double total = 100;
    		String type = "";
    
            CashContext cc = null;
            CashSuper cs = null;
            if ("    ".equals(type)) {
                cs = new CashNormal();
            } else if (" 300 100".equals(type)) {
                cs = new CashReturn(300, 100);
            } else if (" 8 ".equals(type)) {
                cs = new CashRebate(0.8);
            } else {
                throw new Exception("      ");
            }
            cc = new CashContext(cs);
    
            total = cc.getResult(total);
            System.out.println(total);
    
        }
    

    최적화: 간단 한 공장 모델 과 전략 모델 의 결합
    두 가지 종류 만 수정 할 수 있 습 니 다: 테스트 방법 과 CashContext
    public class CashContext {
    
        private CashSuper cs;
    
        public CashContext(String type) throws Exception {
    
            if ("    ".equals(type)) {
                cs = new CashNormal();
            } else if (" 300 100".equals(type)) {
                cs = new CashReturn(300, 100);
            } else if (" 8 ".equals(type)) {
                cs = new CashRebate(0.8);
            } else {
                throw new Exception("      ");
            }
    
        }
    
        public double getResult(double money) {
            return cs.acceptCash(money);
        }
    
    }
    

    테스트 방법:
    public static void main(String[] args) throws Exception {
    
            double total = 100;
            String type = " 8 ";
    
            CashContext cc = new CashContext(type);
    
            total = cc.getResult(total);
            System.out.println(total);
    
        }
    

    총결산
    간단 한 공장 모델 과 전략 모델 의 결합 으로 인해 클 라 이언 트 가 CashSuper 와 CashFactory 를 인식 해 야 하 는 것 이 CashContext 결합 도 를 더욱 낮 추 는 것 으로 바 뀌 었 다.
    구조 적 으로 두 가지 예 는 매우 비슷 하지만 간단 한 공장 모델 의 중점 은 공장 을 사용 하여 인 스 턴 스 를 만 드 는 과정 을 밀봉 하여 클 라 이언 트 가 이에 관심 을 가지 지 않 고 직접 사용 하면 전략 모델 의 중점 은 각종 알고리즘 을 나 누 어 쓴 다음 에 똑 같은 방식 으로 모든 알고리즘 을 호출 하여 알고리즘 의 실현 과 호출 자 간 의 결합 을 감소 하 는 데 있다.전략 모드 는 변 화 를 봉인 하고 그 다음 에 단원 테스트 를 간소화 하 며 각 알고리즘 은 각자 의 테스트 용례 를 단독으로 쓴다

    좋은 웹페이지 즐겨찾기