软件架构设计原则-DIP依赖倒置原则

一、什么是依赖倒转原则 

       依赖倒转(Dependence Inversion Principle ):

1.抽象不应该依赖于细节,细节应该依赖于抽象。

2.高层模块不依赖底层模块,两者都依赖抽象。

 

二、怎样做到依赖倒转

1.工厂方法模式

2.模板方法模式

3.迭代子模式

三、代码示例:

  当系统想增加一个查询渠道,需要修改查询引擎,增加成员变量;如何做到依赖倒置??

package org.jason.designmode.DIP;

public class AAPChannel {
    public void  query()
    {
        System.out.println("查询AAPChannel渠道资源");
    }
}



package org.jason.designmode.DIP;

public class IBEChannel {
    public void  query()
    {
        System.out.println("查询IBEChannel渠道资源");
    }
}


/*
*   查询引擎
*
**/
package org.jason.designmode.DIP;

public class FlightEngine {
    private IBEChannel  ibeChannel;
    private AAPChannel  aapChannel;

    public FlightEngine()
    {
        ibeChannel=new IBEChannel();
        aapChannel=new AAPChannel();
    }
    public void query()
    {
        ibeChannel.query();
        aapChannel.query();
    }

}

  代码改进:

package org.jason.designmode.DIP;

import java.util.List;

public class FlightEngine {
    private List list;
    public FlightEngine()
    {
        list=FlightCommon.getChannel();
    }
    public void query()
    {
        if(list!=null&&list.size()>0)
        {
            for(IFlightChannel  chanel:list)
            {
                  chanel.query();
            }
        }
    }
    public static void main(String[] args)
    {
        FlightEngine  engine=new FlightEngine();
        engine.query();
    }

}



package org.jason.designmode.DIP;

import java.util.*;

public class FlightCommon {
    public  static  List getChannel()
    {
        //根据配置获取支持的渠道列表
        String className = "";
        System.out.println("className="+className);

        //这一块的数据,后续可以通过查询配置表或者redis来加载,demo里面先简单写一下
        List list=  new ArrayList();
        IFlightChannel instance=null;
        try{
            
            className = String.format("org.jason.designmode.DIP.%sChannel",  "AAP");
            instance =(IFlightChannel) Class.forName(className).newInstance();
            list.add(instance);
            System.out.println(instance.getClass());

            className = String.format("org.jason.designmode.DIP.%sChannel",  "IBE");
            instance =(IFlightChannel) Class.forName(className).newInstance();
            System.out.println(instance.getClass());
            list.add(instance);


        }catch (Exception e)
        {
            e.printStackTrace();
        }finally {
            return list;
        }

    }
}

package org.jason.designmode.DIP;

public interface IFlightChannel {
    public void query();

}

package org.jason.designmode.DIP;

public class IBEChannel implements IFlightChannel {
    public void  query()
    {
        System.out.println("查询IBEChannel渠道资源");
    }
}

package org.jason.designmode.DIP;

public class AAPChannel implements IFlightChannel {
    public void  query()
    {
        System.out.println("查询AAPChannel渠道资源");
    }
}

//优点:后续如果增加一个资源渠道,只需要新增一个XXXChannel的实现类,同时在资源渠道的配置表里增加一条渠道配置即可以。

 

你可能感兴趣的:(架构师-内功心法)