IoC容器
- 會實踐Dependency injection
- 提供設定dependency的方法
講白話點就是
- 創造dependency /object
- 注射或傳遞dependency
接著我們來看一下範例
根據 DIP 依賴倒置原則 這篇文章,我們可以將該範例的UML畫出來如下圖
class EatRiceBehavior { void eat() { System.out.println("Person_EATRice"); } } public class Person { EatRiceBehavior behavior=new EatRiceBehavior(); public void eat() { // TODO Auto-generated method stub behavior.eat(); } public static void main(String[] args) { Person person = new Person(); person.eat(); } }
人吃飯,人擁有吃飯的物件來實做吃飯該做的事情,但是依賴於具象是不好的,會造成程式的高耦合性,應該依賴於抽象,所以我們更改架構變成下圖
interface Behavior { void eat(); } class EatRiceBehavior implements Behavior { @Override public void eat() { // TODO Auto-generated method stub System.out.println("eat rice"); } } class EatNoodleBehavior implements Behavior { @Override public void eat() { // TODO Auto-generated method stub System.out.println("eat EatNoodle"); } } class EatDumplingBehavior implements Behavior { @Override public void eat() { // TODO Auto-generated method stub System.out.println("eat Dumpling"); } } public class Person { Behavior behavior; public void eat(Behavior behavior) { behavior.eat(); } public static void main(String[] args) { Person person = new Person(); person.eat(new EatRiceBehavior ()); } }
我就沒有畫出noodle 還有 dumpling的class了 ,但是他的意義其實是,
用程式的意義來說明
原本Person 依賴於 EatRiceBehavior ,當人想要eat的時候就會將指令傳達給EatRiceBehavior
當要吃麵的時候就會將指令傳達給EatNoodleBehavior 這樣的缺點是當想吃其他的東西時參數並無法共用,會產生出許多參數造成管理不便,
但是經過我們修改之後我們將控制權交給了interface Behavior
使得 EatNoodleBehavior、 EatDumplingBehavior、 EatRiceBehavior 皆依賴於Behavior
,只要有人擁有Behavior就擁有他們的控制權,然而Person恰巧擁有Behavior,這使得Person能夠輕易的控制那三個Behavior。
用注射傳遞的方式來說明
我們將Behavior 注射/傳遞至Person內 Person就是Ioc容器他會負責幫我們在class之間做溝通
讓我們可以在上層與下層之間做溝通而不依賴於彼此
沒有留言:
張貼留言