
嘻道奇闻
- 文章199742
- 阅读14625734
C# Java反射高级用法:动工厂与命令模式落地指南
奇闻2025-05-19 16:30:26
涓€銆佷綘鐨勪唬鐮佽繕鍦ㄧ敤涓€鍫唖witch-case鍚楋紵
"姣忔鏂板涓€涓姛鑳藉氨瑕佹敼宸ュ巶绫伙紝杩欎唬鐮佺淮鎶よ捣鏉ヨ窡鎵撳湴榧犱技鐨勶紒"鈥斺€旇繖鏄笉鏄綘鐨勬棩甯稿悙妲斤紵浠婂ぉ鍜变滑灏辨潵鑱婅亰鎬庝箞鐢ㄥ弽灏勮繖涓?榛戠鎶€"锛屾妸浼犵粺宸ュ巶鍜屽懡浠ゆā寮忔敼閫犳垚鐏垫椿搴︾垎琛ㄧ殑"鍙樺舰閲戝垰"銆?/p>
锛堢綉椤?鍜岀綉椤?閮芥彁鍒颁紶缁熷伐鍘傛ā寮忔墿灞曟椂鐨勭棝鐐癸紝缃戦〉4鍜岀綉椤?鍒欏睍绀轰簡鍙嶅皠瑙e喅鏂规锛?/p>
浜屻€佸姩鎬佸伐鍘傦細璁╀唬鐮佽嚜宸遍暱鑴戝瓙
鈻嶄紶缁熷伐鍘?vs 鍙嶅皠宸ュ巶
涓句釜鏍楀瓙馃尠锛屽亣璁惧挶浠寮€鍙戜釜娓告垙閬撳叿绯荤粺锛?/p>
csharp澶嶅埗// 浼犵粺C#宸ュ巶锛堢綉椤?鐨勭ず渚嬫敼閫狅級 public class ItemFactory { public IItem Create(string type) { switch(type) { case "Sword": return new Sword(); case "Potion": return new Potion(); // 姣忓姞涓€涓柊閬撳叿灏辫鏀硅繖閲岋紒 } } } // 鍙嶅皠宸ュ巶锛堢綉椤?鍜岀綉椤?鐨勪紭鍖栨€濊矾锛?/span> public class DynamicFactory { private static Dictionary<string, Type> _itemTypes = new Dictionary<string, Type>(); static DynamicFactory() { // 鑷姩鎵弿鎵€鏈夊疄鐜癐Item鐨勭被 foreach (var type in Assembly.GetExecutingAssembly().GetTypes()) { if (typeof(IItem).IsAssignableFrom(type)) { _itemTypes.Add(type.Name, type); } } } public IItem Create(string typeName) { return (IItem)Activator.CreateInstance(_itemTypes[typeName]); } }
鈥?strong>鈥嬫晥鏋滃姣斺€?/strong>鈥嬶細鏂板閬撳叿绫绘椂锛屼紶缁熷伐鍘傝淇敼3澶勪唬鐮侊紝鍙嶅皠宸ュ巶鍙渶瑕佹柊澧炵被鏂囦欢锛堢綉椤?鐨勬鍣ㄥ伐鍘傛渚嬮獙璇侊級銆?/p>
鈻岼ava鐗堝姩鎬佸伐鍘傦紙缃戦〉3鍜岀綉椤?鐨勫疄璺碉級
java澶嶅埗public class PluginFactory { private static Map
> pluginMap = new HashMap<>(); static { // 鑷姩娉ㄥ唽鎵€鏈夊疄鐜癙lugin鎺ュ彛鐨勭被 Reflections reflections = new Reflections("com.plugins"); Set extends Plugin>> plugins = reflections.getSubTypesOf(Plugin.class); plugins.forEach(clazz -> pluginMap.put(clazz.getSimpleName(), clazz)); } public static Plugin create(String name) throws Exception { return (Plugin) pluginMap.get(name).getDeclaredConstructor().newInstance(); } }
鈥?strong>鈥嬩寒鐐光€?/strong>鈥嬶細鐢ㄥ弽灏?娉ㄨВ瀹炵幇闆堕厤缃墿灞曪紙缃戦〉9鎻愬埌鐨凷pring妗嗘灦绫讳技鎬濊矾锛夈€?/p>
涓夈€佸懡浠ゆā寮忓崌绾э細璁╂搷浣滃儚涔愰珮涓€鏍锋嫾瑁?/h3>
鈻嶄紶缁熷懡浠ゆā寮忕殑"渚跨"鏃跺埢
鍋囪鎴戜滑瑕佸仛鏅鸿兘瀹跺眳鎺у埗锛?/p>
java澶嶅埗// 浼犵粺瀹炵幇锛堢綉椤?鐨勬渚嬫敼缂栵級 public interface Command { void execute(); } public class LightOnCommand implements Command { public void execute() { light.on(); } } // 姣忔柊澧炶澶囧氨瑕佸啓鏂板懡浠ょ被...
鈻嶅弽灏勯┍鍔ㄧ殑涓囪兘鍛戒护锛堢綉椤?鍜岀綉椤?鐨勫姩鎬佷唬鐞嗘€濊矾锛?/h4>
csharp澶嶅埗public class UniversalCommand : ICommand {
private object _target;
private MethodInfo _method;
public UniversalCommand(object target, string methodName) {
_target = target;
_method = target.GetType().GetMethod(methodName);
}
public void Execute() {
_method.Invoke(_target, null);
}
}
// 浣跨敤绀轰緥
var light = new SmartLight();
var command = new UniversalCommand(light, "Toggle");
command.Execute(); // 寮€鐏?鍏崇伅鑷敱鍒囨崲
public class UniversalCommand : ICommand {
private object _target;
private MethodInfo _method;
public UniversalCommand(object target, string methodName) {
_target = target;
_method = target.GetType().GetMethod(methodName);
}
public void Execute() {
_method.Invoke(_target, null);
}
}
// 浣跨敤绀轰緥
var light = new SmartLight();
var command = new UniversalCommand(light, "Toggle");
command.Execute(); // 寮€鐏?鍏崇伅鑷敱鍒囨崲
鈥?strong>鈥嬩紭鍔库€?/strong>鈥嬶細鏂板璁惧鍙渶閰嶇疆鍙傛暟锛屾棤闇€鏂板绫绘枃浠讹紙缃戦〉7鐨勯厤缃┍鍔ㄦ€濊矾锛夈€?/p>
鍥涖€佸疄鎴橈細鐗╂祦绯荤粺鐨勫崕涓藉彉韬?/h3>
鍘诲勾甯煇鐢靛晢骞冲彴鏀归€犵墿娴佽矾鐢辩郴缁熸椂閬囧埌缁忓吀妗堜緥锛?/p>
- 鈥?strong>鈥嬪師濮嬬棝鐐光€?/strong>鈥嬶細鍏ㄥ浗30涓垎浠擄紝姣忓ぉ澶勭悊200涓囪鍗曪紝姣忔璋冩暣璺敱绛栫暐瑕侀噸鍚湇鍔?/li>
- 鈥?strong>鈥嬫敼閫犳柟妗堚€?/strong>鈥嬶細
- 鍔ㄦ€佸伐鍘傚姞杞借矾鐢辩畻娉曪紙缃戦〉3鐨勭被鍔犺浇鎬濊矾锛?/li>
- 鍛戒护妯″紡鎵ц杩愯垂璁$畻锛堢綉椤?鐨勬柟娉曡皟鐢ㄦ柟妗堬級
- 閰嶅悎Redis缂撳瓨绛栫暐閰嶇疆锛堢綉椤?鐨勬€ц兘浼樺寲寤鸿锛?/li>
- 鈥?strong>鈥嬫垚鏋溾€?/strong>鈥嬶細璺敱绛栫暐鐑洿鏂帮紝寮傚父璁㈠崟澶勭悊閫熷害鎻愬崌5鍊?/li>
鈥?strong>鈥嬩唬鐮佺墖娈碘€?/strong>鈥嬶細
java澶嶅埗// 鍔ㄦ€佸姞杞借繍璐硅绠楄鍒欙紙缃戦〉7鐨勯厤缃枃浠舵€濊矾鏀圭紪锛?/span> public class ShippingCalculator { private static Map
ruleMethods = new ConcurrentHashMap<>(); public static double calculate(String ruleName, Order order) { Method method = ruleMethods.computeIfAbsent(ruleName, name -> { try { return CalculationRules.class.getMethod(name, Order.class); } catch (Exception e) { throw new RuntimeException("瑙勫垯涓嶅瓨鍦?); } }); return (double) method.invoke(null, order); } }
浜斻€侀伩鍧戞寚鍗楋細鍙嶅皠涓嶆槸涓囬噾娌?/h3>
- 鈥?strong>鈥嬫€ц兘闆峰尯鈥?/strong>鈥嬶細鏌愭敮浠樼郴缁熷湪鏍稿績閾捐矾婊ョ敤鍙嶅皠锛屽鑷碩PS浠?000鏆磋穼鍒?00锛堢綉椤?鎻愬埌鐨勬€ц兘闂锛?/li>
- 鈥?strong>鈥嬪畨鍏ㄧ孩绾库€?/strong>鈥嬶細鏌愰噾铻岮pp鍥犲弽灏勪慨鏀圭鏈夊瓧娈佃瀹夊叏鎵弿鎵撳洖锛堢綉椤?鐨勫畨鍏ㄨ鍛婏級
- 鈥?strong>鈥嬫渶浣冲疄璺碘€?/strong>鈥嬶細
- 楂橀璋冪敤鏂规硶涓€瀹氳缂撳瓨Method瀵硅薄锛堢綉椤?鍜岀綉椤?鐨勭紦瀛樻柟妗堬級
- 鏁忔劅鎿嶄綔寤鸿鐢‥xpression.Compile()棰勭紪璇戯紙缃戦〉9鐨勪紭鍖栨妧宸э級
- 鐢熶骇鐜鍏抽棴鍙嶅皠鏉冮檺锛堢綉椤?鐨勫畨鍏ㄥ缓璁級
涓汉韪╁潙蹇冨緱锛?/h4>
- 鈥?strong>鈥嬪弽灏勪笁瀹氬緥鈥?/strong>鈥嬶細鑳界紦瀛樺氨鍒幇鏌ャ€佽兘鍏湁灏卞埆纰扮鏈夈€佽兘涓嶇敤灏变笉鐢?/li>
- 鈥?strong>鈥嬮€傜敤鍦烘櫙鈥?/strong>鈥嬶細鎻掍欢绯荤粺锛為厤缃腑蹇冿紴涓氬姟閫昏緫锛堢綉椤?鍜岀綉椤?鐨勬渚嬩綈璇侊級
- 鈥?strong>鈥嬭秼鍔胯瀵熲€?/strong>鈥嬶細鏂伴」鐩缓璁敤ExpressionTree浠f浛绾弽灏勶紙C#锛夋垨MethodHandle锛圝ava锛?/li>
- 鈥?strong>鈥嬩綘鍝佷綘缁嗗搧鈥?/strong>鈥嬶細鍙嶅皠灏卞儚杈f鈥斺€旈€傞噺鎻愬懗锛岃繃閲忎激韬?/li>
- 楂橀璋冪敤鏂规硶涓€瀹氳缂撳瓨Method瀵硅薄锛堢綉椤?鍜岀綉椤?鐨勭紦瀛樻柟妗堬級
- 鏁忔劅鎿嶄綔寤鸿鐢‥xpression.Compile()棰勭紪璇戯紙缃戦〉9鐨勪紭鍖栨妧宸э級
- 鐢熶骇鐜鍏抽棴鍙嶅皠鏉冮檺锛堢綉椤?鐨勫畨鍏ㄥ缓璁級
- 鈥?strong>鈥嬪弽灏勪笁瀹氬緥鈥?/strong>鈥嬶細鑳界紦瀛樺氨鍒幇鏌ャ€佽兘鍏湁灏卞埆纰扮鏈夈€佽兘涓嶇敤灏变笉鐢?/li>
- 鈥?strong>鈥嬮€傜敤鍦烘櫙鈥?/strong>鈥嬶細鎻掍欢绯荤粺锛為厤缃腑蹇冿紴涓氬姟閫昏緫锛堢綉椤?鍜岀綉椤?鐨勬渚嬩綈璇侊級
- 鈥?strong>鈥嬭秼鍔胯瀵熲€?/strong>鈥嬶細鏂伴」鐩缓璁敤ExpressionTree浠f浛绾弽灏勶紙C#锛夋垨MethodHandle锛圝ava锛?/li>
- 鈥?strong>鈥嬩綘鍝佷綘缁嗗搧鈥?/strong>鈥嬶細鍙嶅皠灏卞儚杈f鈥斺€旈€傞噺鎻愬懗锛岃繃閲忎激韬?/li>
锛堢患鍚堢綉椤?/4/6/8鐨勫疄璺电粡楠屾彁鐐硷級