{"id":2479,"date":"2021-04-08T21:48:14","date_gmt":"2021-04-08T13:48:14","guid":{"rendered":"\/?p=2479"},"modified":"2021-04-08T21:48:14","modified_gmt":"2021-04-08T13:48:14","slug":"24-%e5%b7%a5%e5%8e%82%e6%a8%a1%e5%bc%8f%e4%b8%8a","status":"publish","type":"post","link":"http:\/\/xinblog.ltd\/?p=2479","title":{"rendered":"24.\u5de5\u5382\u6a21\u5f0f(\u4e0a)"},"content":{"rendered":"<p>\u4e00\u79cd\u5e38\u7528\u7684\u521b\u5efa\u578b\u7684\u6a21\u578b, \u5de5\u5382\u6a21\u5f0f<\/p>\n<p>\u4e00\u822c\u6765\u8bf4,\u6211\u4eec\u5c06\u5de5\u5382\u6a21\u5f0f\u5206\u4e3a\u4e09\u79cd,\u7b80\u5355\u5de5\u5382 \u5de5\u5382\u65b9\u6cd5\u00a0 \u62bd\u8c61\u5de5\u5382,\u518d\u8fd9\u4e09\u79cd\u7ec6\u5206\u7684\u5de5\u5382\u6a21\u5f0f\u4e2d,\u7b80\u5355\u5de5\u5382\u548c\u5de5\u5382\u65b9\u6cd5\u7684\u539f\u7406\u76f8\u5bf9\u7b80\u5355,\u800c\u4e14\u7ecf\u5e38\u4f7f\u7528,\u6240\u4ee5\u6211\u4eec\u6ce8\u91cd\u7684\u8bf4\u660e\u4e0b\u8fd9\u4e24\u79cd\u5de5\u5382\u6a21\u5f0f,\u6700\u540e\u4e00\u79cd\u62bd\u8c61\u5de5\u5382,\u6211\u4eec\u5219\u7a0d\u5fae\u8bb2\u89e3\u4e00\u4e0b<\/p>\n<p>\u800c\u4e14,\u672c\u7ae0\u7684\u91cd\u70b9\u662f,\u4ec0\u4e48\u65f6\u5019\u7528\u5de5\u5382\u6a21\u5f0f,\u5de5\u5382\u6a21\u5f0f\u7684\u597d\u5904\u662f\u4ec0\u4e48<\/p>\n<p>1.\u7b80\u5355\u5de5\u5382<\/p>\n<p>\u5bf9\u4e8e\u4e0b\u9762\u7684\u4e00\u7cfb\u5217\u4ee3\u7801,\u6839\u636e\u914d\u7f6e\u6587\u4ef6\u7684\u540e\u7f00,\u6765\u9009\u62e9\u4e0d\u540c\u7684\u89e3\u6790\u5668,\u6765\u89e3\u6790\u914d\u7f6e\u79f0\u4e3a\u5185\u5b58\u5bf9\u8c61<\/p>\n<table>\n<tbody>\n<tr>\n<td>public class RuleConfigSource {<\/p>\n<p>public RuleConfig load(String ruleConfigFilePath) {<\/p>\n<p>String ruleConfigFileExtension = getFileExtension(ruleConfigFilePath);<\/p>\n<p>IRuleConfigParser parser = null;<\/p>\n<p>if (&#8220;json&#8221;.equalsIgnoreCase(ruleConfigFileExtension)) {<\/p>\n<p>parser = new JsonRuleConfigParser();<\/p>\n<p>} else if (&#8220;xml&#8221;.equalsIgnoreCase(ruleConfigFileExtension)) {<\/p>\n<p>parser = new XmlRuleConfigParser();<\/p>\n<p>} else if (&#8220;yaml&#8221;.equalsIgnoreCase(ruleConfigFileExtension)) {<\/p>\n<p>parser = new YamlRuleConfigParser();<\/p>\n<p>} else if (&#8220;properties&#8221;.equalsIgnoreCase(ruleConfigFileExtension)) {<\/p>\n<p>parser = new PropertiesRuleConfigParser();<\/p>\n<p>} else {<\/p>\n<p>throw new InvalidRuleConfigException(<\/p>\n<p>&#8220;Rule config file format is not supported: &#8221; + ruleConfigFilePath);<\/p>\n<p>}<\/p>\n<p>String configText = &#8220;&#8221;;<\/p>\n<p>\/\/\u4eceruleConfigFilePath\u6587\u4ef6\u4e2d\u8bfb\u53d6\u914d\u7f6e\u6587\u672c\u5230configText\u4e2d<\/p>\n<p>RuleConfig ruleConfig = parser.parse(configText);<\/p>\n<p>return ruleConfig;<\/p>\n<p>}<\/p>\n<p>private String getFileExtension(String filePath) {<\/p>\n<p>\/\/&#8230;\u89e3\u6790\u6587\u4ef6\u540d\u83b7\u53d6\u6269\u5c55\u540d\uff0c\u6bd4\u5982rule.json\uff0c\u8fd4\u56dejson<\/p>\n<p>return &#8220;json&#8221;;<\/p>\n<p>}<\/p>\n<p>}<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e0a\u9762\u4ee3\u7801\u4e00\u770b\u5c31\u77e5\u9053,\u529f\u80fd\u903b\u8f91\u4e0d\u5b8c\u5584,\u770b\u8d77\u6765\u4f1a\u6709\u76f8\u5bf9\u7684\u5197\u4f59,\u6211\u4eec\u5e94\u8be5\u8bb2\u529f\u80fd\u72ec\u7acb\u7684\u4ee3\u7801\u5757\u62bd\u53d6\u51fa\u6765,\u5f62\u6210\u51fd\u6570,\u7ec4\u6210\u4e00\u4e2acreateParsr()\u51fd\u6570,\u91cd\u6784\u540e\u7684\u4ee3\u7801\u5982\u4e0b<\/p>\n<table>\n<tbody>\n<tr>\n<td>public RuleConfig load(String ruleConfigFilePath) {<\/p>\n<p>String ruleConfigFileExtension = getFileExtension(ruleConfigFilePath);<\/p>\n<p>IRuleConfigParser parser = createParser(ruleConfigFileExtension);<\/p>\n<p>if (parser == null) {<\/p>\n<p>throw new InvalidRuleConfigException(<\/p>\n<p>&#8220;Rule config file format is not supported: &#8221; + ruleConfigFilePath);<\/p>\n<p>}<\/p>\n<p>String configText = &#8220;&#8221;;<\/p>\n<p>\/\/\u4eceruleConfigFilePath\u6587\u4ef6\u4e2d\u8bfb\u53d6\u914d\u7f6e\u6587\u672c\u5230configText\u4e2d<\/p>\n<p>RuleConfig ruleConfig = parser.parse(configText);<\/p>\n<p>return ruleConfig;<\/p>\n<p>}<\/p>\n<p>private String getFileExtension(String filePath) {<\/p>\n<p>\/\/&#8230;\u89e3\u6790\u6587\u4ef6\u540d\u83b7\u53d6\u6269\u5c55\u540d\uff0c\u6bd4\u5982rule.json\uff0c\u8fd4\u56dejson<\/p>\n<p>return &#8220;json&#8221;;<\/p>\n<p>}<\/p>\n<p>private IRuleConfigParser createParser(String configFormat) {<\/p>\n<p>IRuleConfigParser parser = null;<\/p>\n<p>if (&#8220;json&#8221;.equalsIgnoreCase(configFormat)) {<\/p>\n<p>parser = new JsonRuleConfigParser();<\/p>\n<p>} else if (&#8220;xml&#8221;.equalsIgnoreCase(configFormat)) {<\/p>\n<p>parser = new XmlRuleConfigParser();<\/p>\n<p>} else if (&#8220;yaml&#8221;.equalsIgnoreCase(configFormat)) {<\/p>\n<p>parser = new YamlRuleConfigParser();<\/p>\n<p>} else if (&#8220;properties&#8221;.equalsIgnoreCase(configFormat)) {<\/p>\n<p>parser = new PropertiesRuleConfigParser();<\/p>\n<p>}<\/p>\n<p>return parser;<\/p>\n<p>}<\/p>\n<p>}<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u7136\u540e,\u4e3a\u4e86\u4fdd\u8bc1\u5355\u4e00\u804c\u8d23\u539f\u5219,\u6211\u4eec\u9700\u8981\u5c06createParser()\u51fd\u6570\u5265\u79bb\u5230\u4e00\u4e2a\u72ec\u7acb\u7684\u7c7b\u4e2d,\u8fd9\u4e2a\u7c7b\u53ea\u8d1f\u8d23\u5bf9\u8c61\u7684\u5e38\u89c1,\u4e5f\u5c31\u662f\u7b80\u5355\u5de5\u5382\u6a21\u5f0f\u7c7b,\u5982\u4e0b<\/p>\n<table>\n<tbody>\n<tr>\n<td>public class RuleConfigSource {<\/p>\n<p>public RuleConfig load(String ruleConfigFilePath) {<\/p>\n<p>String ruleConfigFileExtension = getFileExtension(ruleConfigFilePath);<\/p>\n<p>IRuleConfigParser parser = RuleConfigParserFactory.createParser(ruleConfigFileExtension);<\/p>\n<p>if (parser == null) {<\/p>\n<p>throw new InvalidRuleConfigException(<\/p>\n<p>&#8220;Rule config file format is not supported: &#8221; + ruleConfigFilePath);<\/p>\n<p>}<\/p>\n<p>String configText = &#8220;&#8221;;<\/p>\n<p>\/\/\u4eceruleConfigFilePath\u6587\u4ef6\u4e2d\u8bfb\u53d6\u914d\u7f6e\u6587\u672c\u5230configText\u4e2d<\/p>\n<p>RuleConfig ruleConfig = parser.parse(configText);<\/p>\n<p>return ruleConfig;<\/p>\n<p>}<\/p>\n<p>private String getFileExtension(String filePath) {<\/p>\n<p>\/\/&#8230;\u89e3\u6790\u6587\u4ef6\u540d\u83b7\u53d6\u6269\u5c55\u540d\uff0c\u6bd4\u5982rule.json\uff0c\u8fd4\u56dejson<\/p>\n<p>return &#8220;json&#8221;;<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>public class RuleConfigParserFactory {<\/p>\n<p>public static IRuleConfigParser createParser(String configFormat) {<\/p>\n<p>IRuleConfigParser parser = null;<\/p>\n<p>if (&#8220;json&#8221;.equalsIgnoreCase(configFormat)) {<\/p>\n<p>parser = new JsonRuleConfigParser();<\/p>\n<p>} else if (&#8220;xml&#8221;.equalsIgnoreCase(configFormat)) {<\/p>\n<p>parser = new XmlRuleConfigParser();<\/p>\n<p>} else if (&#8220;yaml&#8221;.equalsIgnoreCase(configFormat)) {<\/p>\n<p>parser = new YamlRuleConfigParser();<\/p>\n<p>} else if (&#8220;properties&#8221;.equalsIgnoreCase(configFormat)) {<\/p>\n<p>parser = new PropertiesRuleConfigParser();<\/p>\n<p>}<\/p>\n<p>return parser;<\/p>\n<p>}<\/p>\n<p>}<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u8fd9\u5c31\u662f\u7b80\u5355\u5de5\u5382\u7684\u5b9e\u73b0\u65b9\u5f0f,\u5f53\u7136\u56e0\u4e3a\u6bcf\u6b21\u90fd\u662f\u7b80\u5355\u7684\u8c03\u7528\u5bf9\u5e94\u7684\u6784\u9020\u51fd\u6570,\u6765\u521b\u5efa\u65b0\u7684\u7c7b,\u6240\u4ee5\u53ef\u4ee5\u5c06\u521b\u5efa\u597d\u7684\u7c7b\u7f13\u5b58\u8d77\u6765,\u65b9\u4fbf\u4e4b\u540e\u7684\u8c03\u7528,\u4f8b\u5982\u5982\u4e0b\u7684\u5b9e\u73b0\u65b9\u5f0f<\/p>\n<table>\n<tbody>\n<tr>\n<td>public class RuleConfigParserFactory {<\/p>\n<p>private static final Map&lt;String, RuleConfigParser&gt; cachedParsers = new HashMap&lt;&gt;();<\/p>\n<p>static {<\/p>\n<p>cachedParsers.put(&#8220;json&#8221;, new JsonRuleConfigParser());<\/p>\n<p>cachedParsers.put(&#8220;xml&#8221;, new XmlRuleConfigParser());<\/p>\n<p>cachedParsers.put(&#8220;yaml&#8221;, new YamlRuleConfigParser());<\/p>\n<p>cachedParsers.put(&#8220;properties&#8221;, new PropertiesRuleConfigParser());<\/p>\n<p>}<\/p>\n<p>public static IRuleConfigParser createParser(String configFormat) {<\/p>\n<p>if (configFormat == null || configFormat.isEmpty()) {<\/p>\n<p>return null;\/\/\u8fd4\u56denull\u8fd8\u662fIllegalArgumentException\u5168\u51ed\u4f60\u81ea\u5df1\u8bf4\u4e86\u7b97<\/p>\n<p>}<\/p>\n<p>IRuleConfigParser parser = cachedParsers.get(configFormat.toLowerCase());<\/p>\n<p>return parser;<\/p>\n<p>}<\/p>\n<p>}<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u8fd9\u91cc\u987a\u4fbf\u8bf4\u4e00\u4e0b\u4e00\u822c\u5de5\u5382\u7c7b\u7684\u547d\u540d,\u4e00\u822c\u90fd\u662f\u540e\u7f00\u4e3aFactory,\u7136\u540e\u521b\u5efa\u5bf9\u8c61\u7684\u65b9\u6cd5\u5f00\u5934\u90fd\u662fcreate,\u5f53\u7136,\u4e5f\u6709\u7684\u547d\u540d\u4e3agetInstance(),createInstance(),newInstance(),\u4e5f\u6709\u7684\u53eb\u505avalueOf()<\/p>\n<p>\u867d\u7136\u8fd9\u79cd\u7b80\u5355\u5de5\u5382\u7684\u5b9e\u73b0\u65b9\u5f0f,\u9700\u8981\u6211\u4eec\u5728\u589e\u52a0paraser\u7684\u65f6\u5019,\u4fee\u6539\u5de5\u5382\u7c7b\u7684\u4ee3\u7801,\u4f46\u662f\u53ea\u8981\u4e0d\u662f\u9891\u7e41\u7684\u53bb\u4fee\u6539\u5de5\u5382\u7c7b\u7684\u4ee3\u7801,\u5c31\u4e0d\u662f\u8fdd\u53cd\u5f00\u95ed\u539f\u5219\u7684<\/p>\n<p>\u9664\u6b64\u5916,\u4e0a\u9762\u7684if-else\u53ef\u4ee5\u8fdb\u4e00\u6b65\u7701\u7565,\u5c31\u662f\u6211\u4eec\u8bf4\u7684\u5de5\u5382\u65b9\u6cd5<\/p>\n<p>\u90a3\u4e48\u63a5\u4e0b\u6765\u7684\u5b9e\u73b0,\u6211\u76f4\u63a5\u5229\u7528\u591a\u6001\u6765\u8fdb\u4e00\u6b65\u7701\u7565\u8fd9\u4e2a\u5b9e\u73b0<\/p>\n<table>\n<tbody>\n<tr>\n<td>public interface IRuleConfigParserFactory {<\/p>\n<p>IRuleConfigParser createParser();<\/p>\n<p>}<\/p>\n<p>public class JsonRuleConfigParserFactory implements IRuleConfigParserFactory {<\/p>\n<p>@Override<\/p>\n<p>public IRuleConfigParser createParser() {<\/p>\n<p>return new JsonRuleConfigParser();<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>public class XmlRuleConfigParserFactory implements IRuleConfigParserFactory {<\/p>\n<p>@Override<\/p>\n<p>public IRuleConfigParser createParser() {<\/p>\n<p>return new XmlRuleConfigParser();<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>public class YamlRuleConfigParserFactory implements IRuleConfigParserFactory {<\/p>\n<p>@Override<\/p>\n<p>public IRuleConfigParser createParser() {<\/p>\n<p>return new YamlRuleConfigParser();<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>public class PropertiesRuleConfigParserFactory implements IRuleConfigParserFactory {<\/p>\n<p>@Override<\/p>\n<p>public IRuleConfigParser createParser() {<\/p>\n<p>return new PropertiesRuleConfigParser();<\/p>\n<p>}<\/p>\n<p>}<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5f53\u6211\u4eec\u65b0\u589e\u4e00\u79cdparser\u7684\u65f6\u5019,\u53ea\u9700\u8981\u65b0\u589e\u4e00\u4e2a\u5b9e\u73b0\u4e86IRuleConfigParserFactory\u7684Fatory\u63a5\u53e3\u7c7b\u5373\u53ef,\u5de5\u5382\u7c7b\u6a21\u5f0f\u6bd4\u5176\u4ed6\u7684\u6a21\u5f0f\u66f4\u52a0\u7b26\u5408\u5f00\u95ed<\/p>\n<p>\u4f46\u662f\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f,\u4ecd\u7136\u4e0d\u7b80\u5355,\u4e8e\u662f\u6211\u4eec\u518d\u521b\u5efa\u4e00\u4e2a\u7b80\u5355\u5de5\u5382,\u6765\u8c03\u7528\u4e0a\u9762\u7684\u5de5\u5382,\u6765\u521b\u5efa\u5de5\u5382\u7c7b\u5bf9\u8c61<\/p>\n<p>\u5177\u4f53\u4ee3\u7801\u5982\u4e0b<\/p>\n<table>\n<tbody>\n<tr>\n<td>public class RuleConfigSource {<\/p>\n<p>public RuleConfig load(String ruleConfigFilePath) {<\/p>\n<p>String ruleConfigFileExtension = getFileExtension(ruleConfigFilePath);<\/p>\n<p>IRuleConfigParserFactory parserFactory = RuleConfigParserFactoryMap.getParserFactory(ruleConfigFileExtension);<\/p>\n<p>if (parserFactory == null) {<\/p>\n<p>throw new InvalidRuleConfigException(&#8220;Rule config file format is not supported: &#8221; + ruleConfigFilePath);<\/p>\n<p>}<\/p>\n<p>IRuleConfigParser parser = parserFactory.createParser();<\/p>\n<p>String configText = &#8220;&#8221;;<\/p>\n<p>\/\/\u4eceruleConfigFilePath\u6587\u4ef6\u4e2d\u8bfb\u53d6\u914d\u7f6e\u6587\u672c\u5230configText\u4e2d<\/p>\n<p>RuleConfig ruleConfig = parser.parse(configText);<\/p>\n<p>return ruleConfig;<\/p>\n<p>}<\/p>\n<p>private String getFileExtension(String filePath) {<\/p>\n<p>\/\/&#8230;\u89e3\u6790\u6587\u4ef6\u540d\u83b7\u53d6\u6269\u5c55\u540d\uff0c\u6bd4\u5982rule.json\uff0c\u8fd4\u56dejson<\/p>\n<p>return &#8220;json&#8221;;<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>\/\/\u56e0\u4e3a\u5de5\u5382\u7c7b\u53ea\u5305\u542b\u65b9\u6cd5\uff0c\u4e0d\u5305\u542b\u6210\u5458\u53d8\u91cf\uff0c\u5b8c\u5168\u53ef\u4ee5\u590d\u7528\uff0c<\/p>\n<p>\/\/\u4e0d\u9700\u8981\u6bcf\u6b21\u90fd\u521b\u5efa\u65b0\u7684\u5de5\u5382\u7c7b\u5bf9\u8c61\uff0c\u6240\u4ee5\uff0c\u7b80\u5355\u5de5\u5382\u6a21\u5f0f\u7684\u7b2c\u4e8c\u79cd\u5b9e\u73b0\u601d\u8def\u66f4\u52a0\u5408\u9002\u3002<\/p>\n<p>public class RuleConfigParserFactoryMap { \/\/\u5de5\u5382\u7684\u5de5\u5382<\/p>\n<p>private static final Map&lt;String, IRuleConfigParserFactory&gt; cachedFactories = new HashMap&lt;&gt;();<\/p>\n<p>static {<\/p>\n<p>cachedFactories.put(&#8220;json&#8221;, new JsonRuleConfigParserFactory());<\/p>\n<p>cachedFactories.put(&#8220;xml&#8221;, new XmlRuleConfigParserFactory());<\/p>\n<p>cachedFactories.put(&#8220;yaml&#8221;, new YamlRuleConfigParserFactory());<\/p>\n<p>cachedFactories.put(&#8220;properties&#8221;, new PropertiesRuleConfigParserFactory());<\/p>\n<p>}<\/p>\n<p>public static IRuleConfigParserFactory getParserFactory(String type) {<\/p>\n<p>if (type == null || type.isEmpty()) {<\/p>\n<p>return null;<\/p>\n<p>}<\/p>\n<p>IRuleConfigParserFactory parserFactory = cachedFactories.get(type.toLowerCase());<\/p>\n<p>return parserFactory;<\/p>\n<p>}<\/p>\n<p>}<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u8fd9\u6837\u7684\u8bdd,\u6bcf\u6b21\u6dfb\u52a0\u7684\u65b0\u5de5\u5382\u7c7b,\u53ea\u9700\u8981\u521b\u5efa\u65b0\u7684\u5de5\u5382\u7c7b,\u7136\u540e\u6dfb\u52a0\u8fdb\u5de5\u5382RuleConfigParserFactoryMap\u5373\u53ef<\/p>\n<p>\u4f46\u662f,\u5bf9\u4e8e\u8fd9\u79cd\u6bcf\u4e2aFactory\u53ea\u505a\u7b80\u5355\u7684new\u64cd\u4f5c\u7684\u573a\u666f,\u6ca1\u5fc5\u8981\u8bbe\u8ba1\u4e3a\u72ec\u7acb\u7684\u7c7b,\u7b80\u5355\u5de5\u5382\u6bd4\u8fd9\u79cd\u5de5\u5382\u65b9\u6cd5\u66f4\u52a0\u5408\u9002<\/p>\n<p>\u90a3\u4e48,\u4ec0\u4e48\u65f6\u5019\u4f7f\u7528\u5de5\u5382\u65b9\u6cd5,\u4ec0\u4e48\u65f6\u5019\u4f7f\u7528\u7b80\u5355\u5de5\u5382\u5462?<\/p>\n<p>\u5982\u679c\u4e00\u6bb5\u4ee3\u7801\u5757\u7684\u903b\u8f91\u5f88\u590d\u6742,\u5265\u79bb\u540e\u80fd\u8ba9\u6211\u4eec\u7684\u4ee3\u7801\u66f4\u52a0\u6e05\u6670,\u53ef\u8bfb,\u53ef\u7ef4\u62a4,\u90a3\u4e48\u53ef\u4ee5\u62c6\u5206\u4e3a\u5355\u72ec\u7684\u7c7b\u6216\u8005\u51fd\u6570,\u5982\u679c\u53ea\u662f\u7b80\u5355\u7684new\u4e00\u4e0b,\u4f7f\u7528\u7b80\u5355\u5de5\u5382\u6a21\u5f0f\u5427,\u5982\u679c\u662f\u8981\u7ec4\u5408\u5176\u4ed6\u7684\u7c7b,\u90a3\u4e48\u6211\u4eec\u5c31\u9700\u8981\u4f7f\u7528\u5de5\u5382\u65b9\u6cd5\u6a21\u5f0f<\/p>\n<p>\u9664\u6b64\u5916,\u5982\u679c\u5bf9\u8c61\u4e0d\u53ef\u590d\u7528,\u90a3\u4e48\u5de5\u5382\u7c7b\u6bcf\u6b21\u90fd\u8981\u8fd4\u56de\u4e0d\u540c\u7684\u5bf9\u8c61,\u6211\u4eec\u4f7f\u7528\u7b80\u5355\u5de5\u5382\u6a21\u5f0f\u6765\u5b9e\u73b0,\u5c31\u53ea\u80fdif-else,\u6216\u8005\u7528\u5de5\u5382\u6a21\u5f0f\u6765\u8fdb\u884c\u5305\u88f9,\u62c6\u5206<\/p>\n<p>\u62bd\u8c61\u5de5\u5382<\/p>\n<p>\u62bd\u8c61\u5de5\u5382\u6bd4\u8f83\u7279\u6b8a,\u6709\u4e00\u79cd\u60c5\u51b5\u54c8<\/p>\n<p>\u5982\u679c\u89e3\u6790\u5668\u6709\u591a\u79cd\u5206\u7c7b\u65b9\u5f0f,\u6bd4\u5982\u8bf4,\u4e00\u4e2a\u662f\u8d1f\u8d23Rule\u89c4\u5219,\u4e00\u4e2a\u8d1f\u8d23System\u89c4\u5219,\u90a3\u4e48\u5c31\u4f1a\u5c06parser\u7c7b\u5206\u4e3a\u5982\u4e0b8\u4e2a<\/p>\n<p>\u9488\u5bf9\u89c4\u5219\u914d\u7f6e\u7684\u89e3\u6790\u5668\uff1a\u57fa\u4e8e\u63a5\u53e3IRuleConfigParser<\/p>\n<p>JsonRuleConfigParser<\/p>\n<p>XmlRuleConfigParser<\/p>\n<p>YamlRuleConfigParser<\/p>\n<p>PropertiesRuleConfigParser<\/p>\n<p>\u9488\u5bf9\u7cfb\u7edf\u914d\u7f6e\u7684\u89e3\u6790\u5668\uff1a\u57fa\u4e8e\u63a5\u53e3ISystemConfigParser<\/p>\n<p>JsonSystemConfigParser<\/p>\n<p>XmlSystemConfigParser<\/p>\n<p>YamlSystemConfigParser<\/p>\n<p>PropertiesSystemConfigParser<\/p>\n<p>\u90a3\u4e48\u63a5\u4e0b\u5c31\u6bd4\u8f83\u9ebb\u70e6,\u5982\u679c\u9488\u5bf9\u6bcf\u4e00\u4e2a\u90fd\u7f16\u5199\u5bf9\u5e94\u7684\u5de5\u5382\u7c7b,\u9700\u8981\u51998,\u5982\u679c\u8981\u5728\u589e\u52a0\u4e00\u4e2a\u7c7b\u578b,\u90a3\u4e48\u8981\u518d\u589e\u52a04\u4e2a\u5de5\u5382\u7c7b<\/p>\n<p>\u62bd\u8c61\u5de5\u5382\u53ef\u4ee5\u89e3\u51b3\u50cf\u8fd9\u79cd\u95ee\u9898<\/p>\n<p>\u8ba9\u4e00\u4e2a\u5de5\u5382\u8d1f\u8d23\u521b\u5efa\u591a\u4e2a\u4e0d\u540c\u7c7b\u578b\u7684\u5bf9\u8c61,\u800c\u4e0d\u662f\u53ea\u521b\u5efa\u4e00\u79cdparser\u5bf9\u8c61,\u53ef\u4ee5\u6709\u6548\u7684\u51cf\u5c11\u5de5\u5382\u7c7b\u7684\u4e2a\u6570<\/p>\n<table>\n<tbody>\n<tr>\n<td>public interface IConfigParserFactory {<\/p>\n<p>IRuleConfigParser createRuleParser();<\/p>\n<p>ISystemConfigParser createSystemParser();<\/p>\n<p>\/\/\u6b64\u5904\u53ef\u4ee5\u6269\u5c55\u65b0\u7684parser\u7c7b\u578b\uff0c\u6bd4\u5982IBizConfigParser<\/p>\n<p>}<\/p>\n<p>public class JsonConfigParserFactory implements IConfigParserFactory {<\/p>\n<p>@Override<\/p>\n<p>public IRuleConfigParser createRuleParser() {<\/p>\n<p>return new JsonRuleConfigParser();<\/p>\n<p>}<\/p>\n<p>@Override<\/p>\n<p>public ISystemConfigParser createSystemParser() {<\/p>\n<p>return new JsonSystemConfigParser();<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>public class XmlConfigParserFactory implements IConfigParserFactory {<\/p>\n<p>@Override<\/p>\n<p>public IRuleConfigParser createRuleParser() {<\/p>\n<p>return new XmlRuleConfigParser();<\/p>\n<p>}<\/p>\n<p>@Override<\/p>\n<p>public ISystemConfigParser createSystemParser() {<\/p>\n<p>return new XmlSystemConfigParser();<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>\/\/ \u7701\u7565YamlConfigParserFactory\u548cPropertiesConfigParserFactory\u4ee3\u7801<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u603b\u7ed3\u4e00\u4e0b,\u5de5\u5382\u7c7b\u7684\u672c\u8d28\u5f88\u7b80\u5355,\u5c31\u662f\u56db\u4e2a\u65b9\u9762<\/p>\n<p>\u5c01\u88c5\u53d8\u5316,\u521b\u5efa\u903b\u8f91\u7684\u53d8\u5316,\u5bf9\u4e8e\u5c01\u88c5\u597d\u7684\u5de5\u5382\u7c7b\u7684\u8c03\u7528\u8005\u6765\u8bf4,\u6ca1\u6709\u53d8\u6362<\/p>\n<p>\u4ee3\u7801\u590d\u7528,\u521b\u5efa\u4ee3\u7801\u62bd\u79bb\u5230\u72ec\u7acb\u7684\u5de5\u5382\u7c7b\u540e\u53ef\u4ee5\u590d\u7528<\/p>\n<p>\u9694\u79bb\u590d\u6742\u6027,\u5c06\u590d\u6742\u7684\u903b\u8f91\u62bd\u79bb,\u8c03\u7528\u8005\u65e0\u9700\u77e5\u9053\u5982\u4f55\u521b\u5efa\u5bf9\u8c61<\/p>\n<p>\u63a7\u5236\u590d\u6742\u5ea6:\u5c06\u521b\u5efa\u4ee3\u7801\u62bd\u79bb\u51fa\u6765,\u8ba9\u7c7b\u7684\u804c\u8d23\u66f4\u52a0\u5355\u4e00<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u79cd\u5e38\u7528\u7684\u521b\u5efa\u578b\u7684\u6a21\u578b, \u5de5\u5382 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[],"_links":{"self":[{"href":"http:\/\/xinblog.ltd\/index.php?rest_route=\/wp\/v2\/posts\/2479"}],"collection":[{"href":"http:\/\/xinblog.ltd\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/xinblog.ltd\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/xinblog.ltd\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/xinblog.ltd\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2479"}],"version-history":[{"count":0,"href":"http:\/\/xinblog.ltd\/index.php?rest_route=\/wp\/v2\/posts\/2479\/revisions"}],"wp:attachment":[{"href":"http:\/\/xinblog.ltd\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2479"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/xinblog.ltd\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2479"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/xinblog.ltd\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2479"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}