Avalon基本概念(4)-IoC模式

来源:互联网 发布:淘宝树林名妆 假货 编辑:程序博客网 时间:2024/05/21 15:05
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

IoCAvalon后台的关键设计原则之一。IoC原则强制进行安全设计。

IoC的含义

设计者在对象之间创建一个能够对委托阶层中的特定消息进行响应的链。一个主要意思是:父对象控制子对象。这样的话,SAX API不是IoC的,因为它的目的是从一个源传信息到处理器。

类似的定义是军队的命令链(Chain of Command)。军队提供新兵他们所需要的基本东西执行该军衔的操作,发布新兵必须遵守的命令。相同的原则应用到代码中。每个组件由示例实体(instantiating entity)提供操作所需要的,然后示例实体作用于组件要执行如何。

这个类似定义中有一些不同:军官可以向比他军衔小的人发布命令。而在开发中,为了确保安全,是没有这样的模式的。IoC是从一个父对象(控制)到一个子对象(被控制)。一个父对象可以有多个子对象,而一个子对象只能有一个父对象。

 

如何应用IoC

IoC使用一种很简单的方式来应用。这意味着组件架构使用被动(passive)结构,如下面的例子:

class MyComponent 
    implements LogEnabled
{
    Logger logger;
 
    public enableLogging(Logger newLogger)
    {
        this.logger = newLogger;
    }
 
    myMethod() 
    {
        logger.info("Hello World!");
    }
}

MyComponent的父类实例化MyComponent,设置Logger,调用myMethod()。组件是不自主的,因为被给了由父类配置的Logger

除了父类,MyComponent类没有声明;除非父类给与它所需要的实现,MyComponent无法获得Logger实现的引用。

 

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>