디자인 모델 의 - (1) 간단 한 공장 모델 | 전략 모델
단순 공장 모드
→ 업그레이드 판 공장 방법 모델 안내
정의: 용기 가 누 구 를 예화 해 야 하 는 지, 앞으로 예화 대상 을 증가 시 킬 수 있 는 지, 모두 변화 하기 쉬 운 곳 이 므 로 독립 된 클래스 로 인 스 턴 스 를 만 드 는 곳 을 고려 해 야 합 니 다. 이것 이 바로 공장 입 니 다.
정 의 는 영원히 정의 일 뿐 이해 하기 어렵 습 니 다. 직접 한 번 실현 하 는 것 이 야 말로 정 도 를 배 우 는 것 입 니 다. 아래 에 코드 를 직접 붙 입 니 다.
수요: 사용자 가 두 개의 숫자 와 한 기 호 를 입력 하고 기호의 연산 을 하 며 결과 변경 점 을 출력 합 니 다. 루트 연산 이 추가 되면 어떻게 처리 합 니까?
간단 한 공장 을 위해 준비 하 다.
우선 두 숫자 에 대해 일정한 조작 을 하 는 것 이 필요 하 다. 그러면 우 리 는 먼저 조작 류 를 정의 한다.
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 결합 도 를 더욱 낮 추 는 것 으로 바 뀌 었 다.
구조 적 으로 두 가지 예 는 매우 비슷 하지만 간단 한 공장 모델 의 중점 은 공장 을 사용 하여 인 스 턴 스 를 만 드 는 과정 을 밀봉 하여 클 라 이언 트 가 이에 관심 을 가지 지 않 고 직접 사용 하면 전략 모델 의 중점 은 각종 알고리즘 을 나 누 어 쓴 다음 에 똑 같은 방식 으로 모든 알고리즘 을 호출 하여 알고리즘 의 실현 과 호출 자 간 의 결합 을 감소 하 는 데 있다.전략 모드 는 변 화 를 봉인 하고 그 다음 에 단원 테스트 를 간소화 하 며 각 알고리즘 은 각자 의 테스트 용례 를 단독으로 쓴다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.