1. 程式人生 > >關於介面隔離原則的一個實現

關於介面隔離原則的一個實現

介面分離原則(ISP - interface segregation principle)

使用場合,提供呼叫者需要的方法,遮蔽不需要的方法.滿足介面隔離原則.

比如說電子商務的系統,有訂單這個類,有三個地方會使用到,
一個是門戶,只能有查詢方法,
一個是外部系統,有新增訂單的方法,
一個是管理後臺,新增刪除修改查詢都要用到.

根據介面隔離原則(ISP),一個類對另外一個類的以來性應當是建立在最小的介面上.
也就是說,對於門戶,它只能依賴有一個查詢方法的介面.

UML結構如下:

 

下面是實現的程式碼.

//--這兒不用介面繼承,因為可能出現修改了父介面影響了子介面
interface IOrderForPortal{
    String getOrder();
}

interface IOrderForOtherSys{
    String insertOrder();
    String getOrder();
}

interface IOrderForAdmin{ //extends IOrderForPortal,IOrderForOtherSys
    String deleteOrder();
    String updateOrder();
    String insertOrder();
    String getOrder();
}

/*
interface IOrderForPortal{
    String getOrder();
}

interface IOrderForOtherSys{
    String insertOrder();
}

interface IOrderForAdmin extends IOrderForPortal,IOrderForOtherSys{
    String updateOrder();
    String deleteOrder();
}
*/

class Order implements IOrderForPortal,IOrderForOtherSys,IOrderForAdmin{
    private Order(){
        //--什麼都不幹,就是為了不讓直接 new,防止客戶端直接New,然後訪問它不需要的方法.
    }

    //返回給Portal
    public static IOrderForPortal getOrderForPortal(){
        return (IOrderForPortal)new Order();
    }
    //返回給OtherSys
    public static IOrderForOtherSys getOrderForOtherSys(){
        return (IOrderForOtherSys)new Order();
    }
    //返回給Admin
    public static IOrderForAdmin getOrderForAdmin(){
        return (IOrderForAdmin)new Order();
    }

    //--下面是介面方法的實現.只是返回了一個String用於演示---------------

    public String getOrder(){
        return "implemented getOrder";
    }

    public String insertOrder(){
        return "implemented insertOrder";
    }

    public String updateOrder(){
        return "implemented updateOrder";
    }

    public String deleteOrder(){
        return "implemented deleteOrder";
    }
}

public class TestCreateLimit{
    public static void main(String[] args){
        IOrderForPortal orderForPortal = Order.getOrderForPortal();
        IOrderForOtherSys orderForOtherSys = Order.getOrderForOtherSys();
        IOrderForAdmin orderForAdmin = Order.getOrderForAdmin();

        System.out.println("Portal門戶呼叫方法:"+orderForPortal.getOrder());
        System.out.println("OtherSys外部系統呼叫方法:"+orderForOtherSys.insertOrder());
        System.out.println("Admin管理後臺呼叫方法:"+orderForAdmin.getOrder()+";"+orderForAdmin.insertOrder()+";"+orderForAdmin.updateOrder()+";"+orderForAdmin.deleteOrder());
    }
}


這樣就能很好的滿足介面隔離原則了,呼叫者只能訪問它自己的方法,不能訪問到不應該訪問的方法.