디자인 패턴 - 전략 패턴 및 공장 패턴의 조합

  • 어떻게 전략 패턴 및 공장 패턴의 조합

전략 패턴 및 공장 패턴에 모든 사람들이 아주 이해가 아닌 경우에, 당신은 이전 기사를 볼 수 있습니다
: 전략 패턴 https://www.jianshu.com/p/958281936901
공장 패턴 : https://www.jianshu.com/p/9078481e00c6을

그들은 마이크로 채널 지불 할 때의 사용에 대한 지불, 마이크로 채널 지불을 사용하고 있습니다 :

우리의 지불 금액은 우리의 잔액보다 큰 경우 (1), 우리 은행 카드 결제, 사용
안에 돈을 균형 것입니다 우리의 우선 순위를 균형을 시간의 2, 충분히
: 직불 전략 한
균형 (blance)> = 지불 금액 ( tradeAmout) 균형
직불 전략 II :
균형 (blance) <지불 금액 (tradeAmout) 은행 카드를 사용하여
이 정책 모드의 실제적인 응용 프로그램입니다,하지만 당신은 결함 정책의 패턴이 어떻게 기억 분명히? 또한) 이상 지식의 원칙 (최소 지식 원칙의 약어 LKP라는 데메테르의 법칙 (데메테르 (데메테르의 법칙)과 일치하지 않는 경우, 특정 전략에 노출뿐만 아니라 적합하지 않습니다 상위 모듈에 의해 초기화해야합니다 이해 가능한 한 적은 다른 객체에 객체가되어야한다는, 낯선 얘기하지 않습니다 참고 : 바이두 백과 사전에서 발췌, 데메테르 다음의 법 당신은 세부 사항) 충돌로 이동합니다. 높은 레벨의 모듈 레벨 만 상위 접촉 모듈과의 관계를 결합되어서는 안된다. 문제는, 우리는 공장 패턴은 우리가이 문제를 해결하는 데 도움이, 해결하기 위해 시도해야합니다. 그러나 공장 모델의 도입도 문제 클래스를 지정하는 팩토리 메소드를 가지고,이 객체를 생성 할 수 있습니다, 우리는 완료 열거.
처음에 우리는 두 개의 엔티티 클래스 WxBlance 및 WxTrade를 구축

import java.math.BigDecimal;

/**
 * @author shuliangzhao * @Title: WxBlance * @ProjectName design-parent * @Description: TODO * @date 2019/5/28 23:50 */ public class WxBlance { //余额 private BigDecimal blance; public BigDecimal getBlance() { return blance; } public void setBlance(BigDecimal blance) { this.blance = blance; } } 
import java.math.BigDecimal;

/**
 * @author shuliangzhao * @Title: Trade * @ProjectName design-parent * @Description: TODO * @date 2019/5/28 23:51 */ public class WxTrade { private BigDecimal tradeAmout; private String tradeNo; private BigDecimal userAmout; public BigDecimal getUserAmout() { return userAmout; } public void setUserAmout(BigDecimal userAmout) { this.userAmout = userAmout; } public String getTradeNo() { return tradeNo; } public void setTradeNo(String tradeNo) { this.tradeNo = tradeNo; } public BigDecimal getTradeAmout() { return tradeAmout; } public void setTradeAmout(BigDecimal tradeAmout) { this.tradeAmout = tradeAmout; } } 

직불 전략 인터페이스

/**
 * @author shuliangzhao * @Title: Deduction * @ProjectName design-parent * @Description: TODO * @date 2019/5/28 23:53 */ public interface Deduction { public boolean exec(WxBlance wxBlance,WxTrade wxTrade); } 

직불 전략

/**
 * @author shuliangzhao * @Title: BlanceDeduction * @ProjectName design-parent * @Description: TODO * @date 2019/5/28 23:54 */ public class BlanceDeduction implements Deduction { @Override public boolean exec(WxBlance wxBlance, WxTrade wxTrade) { if (wxBlance.getBlance().compareTo(wxTrade.getTradeAmout()) >= 0) { wxTrade.setUserAmout(wxBlance.getBlance()); } return true; } } 

직불 전략 II

/**
 * @author shuliangzhao * @Title: IdCardDeduction * @ProjectName design-parent * @Description: TODO * @date 2019/5/28 23:54 */ public class IdCardDeduction implements Deduction { @Override public boolean exec(WxBlance wxBlance, WxTrade wxTrade) { if (wxBlance.getBlance().compareTo(wxTrade.getTradeAmout()) < 0) { wxTrade.setUserAmout(wxTrade.getTradeAmout()); } return true; } } 

지불 거부 정책 패키지

/**
 * @author shuliangzhao * @Title: DedutionContext * @ProjectName design-parent * @Description: TODO * @date 2019/5/28 23:58 */ public class DedutionContext { private Deduction deduction; public DedutionContext(Deduction deduction) { this.deduction = deduction; } public boolean exec(WxBlance wxBlance,WxTrade wxTrade) { return deduction.exec(wxBlance,wxTrade); } } 

일반적인 정책 컨텍스트. 모든 정책 클래스의 결함 전략 패턴은 어떻게을 수정하기 위해 노출? 공장 패턴을 사용하여 정책 개체 매핑에 따라 생성

열거 전략

/**
 * @author shuliangzhao * @Title: StrategyEnum * @ProjectName design-parent * @Description: TODO * @date 2019/5/29 0:00 */ public enum StrategyEnum { BlanceDeduction("com.sl.factorystrategy.BlanceDeduction"), IdCardDeduction("com.sl.factorystrategy.IdCardDeduction"); String value = ""; private StrategyEnum(String value) { this.value = value; } public String getValue() { return value; } } 

전략 공장

/**
 * @author shuliangzhao * @Title: StrategyFactory * @ProjectName design-parent * @Description: TODO * @date 2019/5/29 0:03 */ public class StrategyFactory { public static Deduction getDeduction(StrategyEnum strategyEnum) { Deduction deduction = null; try { deduction = (Deduction)Class.forName(strategyEnum.getValue()).newInstance(); } catch (Exception e) { e.printStackTrace(); } return deduction; } } 

직불 호출 클래스

/**
 * @author shuliangzhao * @Title: DeductionFacade * @ProjectName design-parent * @Description: TODO * @date 2019/5/29 0:06 */ public class DeductionFacade { //扣款 public static void deduct(WxBlance wxBlance,WxTrade wxTrade) { StrategyEnum strate = getStrate(wxBlance, wxTrade); Deduction deduction = StrategyFactory.getDeduction(strate); deduction.exec(wxBlance,wxTrade); } //获取扣款策略 private static StrategyEnum getStrate(WxBlance wxBlance,WxTrade wxTrade) { if (wxBlance.getBlance().compareTo(wxTrade.getTradeAmout()) < 0) { return StrategyEnum.IdCardDeduction; }else { return StrategyEnum.BlanceDeduction; } } } 

클라이언트 클라이언트를 호출

/**
 * @author shuliangzhao * @Title: Client * @ProjectName design-parent * @Description: TODO * @date 2019/5/29 0:10 */ public class Client { public static void main(String[] args) { WxTrade wxTrade = new WxTrade(); wxTrade.setTradeAmout(new BigDecimal("1000")); WxBlance wxBlance = new WxBlance(); wxBlance.setBlance(new BigDecimal("999")); DeductionFacade.deduct(wxBlance,wxTrade); System.out.println(wxTrade.getUserAmout()); } } 

결과

 

 

요약 :
전략 모드 : 두 정책이 전환이 없는지 확인하기 위해, 직불 패키지에 대한 책임, 미래에 정책을 추가하는 것이 매우 쉽습니다

공장 모드 : 전략 모드는 특정 정책 객체 팩토리 모드를 생성, 외부 노출의 문제를 수정해야합니다

추천

출처www.cnblogs.com/treeshu/p/10959615.html