- 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
沒有留言:
張貼留言