- Constructor Injection
- Property Injection
- Interface Injection
以下要直接介紹這三個方法
Constructor Injection
class Behavior { public void Run() { System.out.println("Run"); } } public class ConstructorInjection { /** * @param args */ private Behavior behavior; public ConstructorInjection(Behavior _be) { behavior = _be; } public void Execute() { behavior.Run(); } public static void main(String[] args) { // TODO Auto-generated method stub ConstructorInjection injection = new ConstructorInjection(new Behavior()); injection.Execute(); } }
上面的方法是將物件在class 初始化的時候將所需要的Behavior直接注入,來避免高偶合(繼承)的問
題
Property Injection
class TomRun { public void Run() { System.out.println("Run"); } } public class PropertyInjection { /** * @param args */ private TomRun behavior; public TomRun GetTomRun() { return behavior; } public void setTomRun(TomRun _be) { behavior = _be; } public void Execute() { behavior.Run(); } public static void main(String[] args) { // TODO Auto-generated method stub PropertyInjection injection = new PropertyInjection(); injection.setTomRun(new TomRun()); injection.Execute(); } }
上面的方法是利用getter and setter 讓我們將所需要的 TomRun注入 來避免高耦合(繼承)的情形
Interface Injection
interface RunBehavior { void Run(); } public class interfaceInjection implements RunBehavior { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub RunBehavior behavior = new interfaceInjection(); behavior.Run(); } @Override public void Run() { // TODO Auto-generated method stub System.out.println("Run"); } }
上面的方法是利用 interface 讓class implements 該interface 並實作之
利用interface 注入來避免高耦合(繼承)的問題
利用這些方法,我們可以避免使用繼承,使用相依注入,降低耦合,
當然,第一個例子和第二個例子更好的寫法是使用interface 然後注入使用的參數是interface而不是class 這樣又可以呼應到DIP的要點
依賴抽象類別,不要依賴具象類別。
利用抽象來當作class之間溝通的方式,這樣寫出來的程式耦合度會更低,會更好maintain
沒有留言:
張貼留言