Cd Chen's Services

ba ba ba la~~

Java 鬆綁 (一):利用多型鬆綁類別的依賴關係

在學習 OO 的過程中,很多前輩先進都會強調「鬆綁」的原則。所謂的鬆綁,就是把元件與元件之間依賴關係降到最低。鬆綁之後可以讓我們未來維護與擴充功能時,能夠更加的方便。為達成鬆綁原則,會充分利用 OOP 語言本身提供的機制來實作之,以 Java 為例,我們會利用多型來完成鬆綁的效果。

例如:我需要寫一個打招呼的程式,沒有考慮鬆綁原則時,可以這樣寫:

package org.cdchen.serviceloaders.apps;

public class SayHelloMain {
	public static void main(String[] args) {
		System.out.println("Hello to cdchen.");
	}
}

這樣的寫法非常的直接與單純,但卻產生了一個問題:如果以後要改用其他方式打招呼,就得重新修改程式,並且重新編譯才行。為此,我們可以考慮這樣做:

首先,定義一個名為 GreetingService 的 Interface:

package org.cdchen.serviceloaders;

public interface GreetingService {
	void greeting(String who);
}

GreetingService 介面中只定義實作的類別裡,必須要提供名為 greeting() 的方法,至於如何招呼的細節,則由實作的類別來完成。

例如,我定義了 HiGreetingServiceHasEatingService 兩個類別,來實作 GreetingService 介面:

  • HiGreetingService:
    package org.cdchen.serviceloaders.impls;
    
    import org.cdchen.serviceloaders.GreetingService;
    
    public class HiGreetingService implements GreetingService {
    	public void greeting(String who) {
    		System.out.println("Hi, " + who + ".");
    	}
    }
    
  • HasEatingService:
    package org.cdchen.serviceloaders.impls;
    
    import org.cdchen.serviceloaders.GreetingService;
    
    public class HasEatingService implements GreetingService {
    	static {
    		// 為了證明是動態載入,所以在這裡加上這個動作!!
    		System.out.println("INFO: HasEatingService Loading!!");
    	}
    	
    	public void greeting(String who) {
    		System.out.println(who + ", Has eating??");
    	}
    }
    

為了方便以後執行打招呼的動作,我又定義了 GreetingServiceUtil 類別:

package org.cdchen.serviceloaders.apps;

import org.cdchen.serviceloaders.GreetingService;

class GreetingServiceUtil {
	public static void callService(GreetingService service) {
		System.out.print("Class Name: " + service.getClass().getName());
		System.out.print(", Message: ");
		service.greeting("cdchen");
	}
}

完成後,我們來看看主程式如何實作打招呼的動作 (StaticLoadingMain):

package org.cdchen.serviceloaders.apps;

import org.cdchen.serviceloaders.GreetingService;
import org.cdchen.serviceloaders.impls.HasEatingService;

public class StaticLoadingMain {
	public static void main(String[] args) {
		GreetingService service = new HasEatingService();
		GreetingServiceUtil.callService(service);
	}
}

這樣做的好處,在於未來如果更換原有問候吃飽沒的招呼動作,換成只說嗨時,我們只需要變更主程式的第 8 行:

      GreetingService service = new HiGreetingService();

這樣是不是方便許多呢??

 

這篇內容的 Trackback 網址:

http://www.cdchen.idv.tw/trackback/1058