zxbyhcsdn

 

关于接口隔离原则的一个实现:

关于接口隔离原则的一个实现:
使用场合,提供调用者需要的方法,屏蔽不需要的方法.满足接口隔离原则.

比如说电子商务的系统,有订单这个类,有三个地方会使用到,
一个是门户,只能有查询方法,
一个是外部系统,有添加订单的方法,
一个是管理后台,添加删除修改查询都要用到.

根据接口隔离原则(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());
    }
}


这样就能很好的满足接口隔离原则了,调用者只能访问它自己的方法,不能访问到不应该访问的方法.

欢迎讨论...写这些的目的就是为了共同进步,有什么错误或者不足,欢迎指出....

posted on 2008-07-25 18:03 zxbyh 阅读(3095) 评论(8)  编辑  收藏 所属分类: OOAD

评论

# re: 关于接口隔离原则的一个实现: 2008-07-25 23:49 hoho强

恩 不错 之前没看到过这样的方法  回复  更多评论   

# re: 关于接口隔离原则的一个实现: 2008-07-26 14:29 zhuxing

写的还是不错的

ISP作为OO中5个最主要的设计原则之一,在实际运用的时候往往会在实现细节上面出问题,关键是如何管理窄接口对应实例的问题,核心是创建实例化任务的封装。

以楼主的例子为例,楼主很好的利用的creation method(以静态公共接口提供实例)的方式,很好的将目标接口对应实例创建和初始化进行了封装,并和窄接口的使用客户端进行了解藕。如果不是这样,那么ISP的原则可能就在客户端创建实例的过程中被扭曲了。

更负责一些的情况,可以果断的采用工厂的方式提供实例。宁可稍微过度设计,也要坚决避免藕合。  回复  更多评论   

# re: 关于接口隔离原则的一个实现: 2008-07-26 16:31 fish4j

不错的文章,言简意赅 , 个人感觉配合工厂效果会更好 ^^  回复  更多评论   

# re: 关于接口隔离原则的一个实现: 2008-07-26 19:23 zxbyh

对,这儿可以配合工厂.
但是我讲这个的重点是怎样解决 隔离的问题,
我担心再拉进工厂,会冲淡主题了!!  回复  更多评论   

# re: 关于接口隔离原则的一个实现: 2008-10-26 22:20 C#

学习学习  回复  更多评论   

# re: 关于接口隔离原则的一个实现: 2009-01-09 08:26 seman

//因为Order.getOrderForPortal()返回的实质还是Order类,只是窄化了
//如果client知道,并强制转换成Order的话,则后果很难想象

System.out.println("Portal门户调用方法:" + ((Order)orderForPortal).insertOrder());
  回复  更多评论   

# re: 关于接口隔离原则的一个实现: 2009-03-06 09:16 sys

如果这三个接口中任意一个有变化怎么办??  回复  更多评论   

# re: 关于接口隔离原则的一个实现: 2009-11-26 21:17 zxbyh

一般来说接口是抽象层次上的,属于比较高层次的业务逻辑,在设计的时候尽量考虑不会发生变化.

比如说,你的主板上的内存插槽是DDR2的,你就只能上DDR2的内存,
如果要变成DDR3的接口,那只有考虑更换主板.
其实当发生这样的情况的时候,就是应当考虑"重构"了.
  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜