精华内容
参与话题
问答
  • 接口隔离要做的事: 如果一个类通过一个接口的实现类,只使用了部分方法,则应当将接口拆分(按照最小接口原则)拆成多个接口 举例: 如下有一个接口 Interface1 有5个抽象方法,其中B、D都是Interface1的实现...

    基本概念:

           接口实现类不应该依赖它不需要的接口,即要保证最小接口原则。

    接口隔离要做的事:

           如果一个类通过一个接口的实现类,只使用了部分方法,则应当将接口拆分(按照最小接口原则)拆成多个接口

    举例:

    如下有一个接口 Interface1 有5个抽象方法,其中B、D都是Interface1的实现类

    而A需要使用B实现的operation1-3方法,C则需要使用D实现的operation1,4,5方法。

    此时就会出现一个问题:B不是A的最小接口。D不是C的最小接口 (违背了最小接口原则)

    解决方法:

           将接口1拆分成3个接口:接口一有operation1、接口二有operation2,3、接口三有operation4,5

    利用接口的多态(可以被类implements多个接口) 特性实现最小接口原则

    即B类实现接口一、接口二

    D类实现接口一、接口三

    这样B是A的最小接口,D是C的最小接口。即准守了最小接口原则

     

    展开全文
  • 接口隔离原则(Interface Segregation Principle or ISP) 客户端不应该依赖它不需要的接口。 一个类对另外一个类的依赖性应当是建立在最小的接口上的。 示例 public abstract class InvoiceBase { string ...

    接口隔离原则(Interface Segregation Principle or ISP)

    客户端不应该依赖它不需要的接口。
    一个类对另外一个类的依赖性应当是建立在最小的接口上的。

    示例

    public abstract class InvoiceBase {
    
        string InvoiceCode { get; set; }
        string InvoiceNumber { get; set; }
    
    }
    
    public interface IInvoice {
    
        bool CreateInvoice(InvoiceBase invoice);
        bool PrintInvoice(InvoiceBase invoice);
        bool SendInvoice(InvoiceBase invoice);
    
    }
    
    public class Invoice : InvoiceBase, IInvoice {
    
        public bool CreateInvoice(Invoice invoice) {
            Console.WriteLine("Create Invoice!");
            return true;
        }
    
        public bool PrintInvoice(Invoice invoice) {
            Console.WriteLine("Print Invoice!");
            return true;
        }
    
        public bool SendInvoice(Invoice invoice) {
            Console.WriteLine("Send Invoice by Email!");
            return true;
        }
    
    }
    

    首先用InvoiceBase建立发票基类,其中包含发票代码和发票号码2个公共属性。IInvoice接口包含生成发票、打印发票和发送发票3个“动作”。生成发票和打印发票属于IInvoice接口是比较合理的,然后发送发票的动作放在此接口中并不同样如此,因为有些发票我们并不想发送出去,此种设计导致的结果是实现类Invoice最终会变成臃肿,原因是IInvoice接口太“胖”了。这种设计带来的另外一个后果是不利于未来的扩展,例如我们想为发票增加一个发票作废的动作,我们不得不修改所有IInvoice的实现类,而这些修改却并不是必要的。因为某些实现类中我们只是想使用发票的发送动作而已,却不得不为发票作废增加一个实现代码,明显违背开闭原则。以下给出一个解决方案以供参考:

    public interface IInvoiceAction {
    
        bool CreateInvoice(IInvoiceBase invoice);
        bool PrintInvoice(IInvoiceBase invoice);
        bool CancelInvoice(IInvoiceBase invoice);
    
    }
    
    public interface IInvoiceNotify {
    
        bool SendInvoice(IInvoiceBase invoice);
    
    }
    

    建立IInvoiceAction接口和IInvoiceNotify接口以分离发票本身的行为和发票发送动作。

    public interface IInvoice : IInvoiceAction, IInvoiceNotify {
    
    }
    

    建立联合接口IInvoice方便在某些情况下需要同时使用两者的功能。

    //增值税发票
    public class VatInvoice : InvoiceBase, IInvoiceAction {
    
        public string CheckCode { get; set; }
    
        public bool CreateInvoice(IInvoiceBase invoice) {
            Console.WriteLine("Create Invoice!");
            return true;
        }
    
        public bool PrintInvoice(IInvoiceBase invoice) {
            Console.WriteLine("Print Invoice!");
            return true;
        }
    
        public bool CancelInvoice(IInvoiceBase invoice) {
            Console.WriteLine("Cancel Invoice!");
            return true;
        }
    
    }
    
    //电子发票
    public class ElectronicInvoice : InvoiceBase, IInvoiceNotify {
    
        public string PdfFile { get; set; }
    
        public bool SendInvoice(IInvoiceBase invoice) {
            Console.WriteLine("Send Invoice by Email!");
            return true;
        }
    
    }
    

    增值税发票类VatInvoice和电子发票类ElectronicInvoice,仅实现IInvoiceAction或IInvoiceNotify接口并增加校验码和Pdf文件属性。

    此例我们假设电子发票不用实现IInvoiceAction接口,我们只想发送电子发票的PDF文件。

    public class Invoice : InvoiceBase, IInvoice {
    
        public bool CreateInvoice(IInvoiceBase invoice) {
            Console.WriteLine("Create Invoice!");
            return true;
        }
    
        public bool PrintInvoice(IInvoiceBase invoice) {
            Console.WriteLine("Print Invoice!");
            return true;
        }
    
        public bool CancelInvoice(IInvoiceBase invoice) {
            Console.WriteLine("Cancel Invoice!");
            return true;
        }
    
        public bool SendInvoice(IInvoiceBase invoice) {
            Console.WriteLine("Send Invoice by Email!");
            return true;
        }
    
    }
    

    联合接口IInvoice的实现类Invoice,方便某些情况下需要同时使用所有的功能。

    通过以上的代码改造,我们将接口功能最小化,每一个接口只负责与其自身相关的功能,防止功能过多导致的“接口污染”问题,符合接口隔离原则,并且有利于未来的扩展,同时符合开闭原则。

    展开全文
  • 接口测试工具Postman接口测试图文教程

    万次阅读 多人点赞 2018-07-11 13:10:03
    市场上有很多优秀的,完善的接口测试工具,比如SoapUI,Postman等,能够高效的帮助后端开发人员独立进行接口测试。这里使用Postman接口测试工具,此处以请求方式为POST的userLogin登录接口为例。

    目录

    一、前言

    二、Postman安装和使用

    三、请求方式

    四、资金记录接口实例演示


    一、前言

        在前后端分离开发时,后端工作人员完成系统接口开发后,需要与前端人员对接,测试调试接口,验证接口的正确性可用性。而这要求前端开发进度和后端进度保持基本一致,任何一方的进度跟不上,都无法及时完成功能模块的测试。
        做为后端开发人员,要求独立开发完成某个接口后,开发人员自己需要先测试通过后再提交给测试人员进行测试,否则会出现到测试人员哪里业务流程根本就走不通,或者BUG会过多的情况等。
        市场上有很多优秀的,完善的接口测试工具,比如SoapUI,Postman等,能够高效的帮助后端开发人员独立进行接口测试。这里使用Postman接口测试工具,此处以请求方式为POST的userLogin登录接口为例。

    二、Postman安装和使用

        1、这个直接去官网下载即可,我们使用免费版即可满足基本接口测试,根据个人或者公司的项目实际情况考虑是否需要专业版或者其他。
     
    免费版官网链接:https://www.getpostman.com/postman
    下载好的安装程序Postman-Win64-xxx-Setup.exe,双击安装即可。建议安装在非系统盘,即C盘在外的其他盘,另建议使用全英文路径,避免使用中文路径。
     
        2、打开Postman如下图2-1,可以关闭该页面跳过注册账户,非登陆状态下该工具可以直接使用。接下来出现引导页面,类似IDEA,Android Studio等开发工具的引导页。此处关闭即可。
    图2-1注册账户图
     
    图2-2项目创建引导图

    3、进入Postman主页面并创建项目接口集合

        这里是我之前用过,所以左侧文件栏存在几个已有的文件夹。
        选择功能菜单New下的Collection创建项目接口集合。新建一个亿的项目A hundred million,可在Description部分写一下项目描述。

    图2-3Postman主页面
     
    图2-4新建项目接口集合图

    4、创建项目模块文件夹

        一般项目会分多个管理模块或者功能模块进行开发。这里可根据项目具体情况创建子文件夹方便接口管理。此处在A hundred million项目右键创建资产管理assets文件夹、user用户管理文件夹。可将测试的接口实例保存在对于管理模块下。

    图2-5新建资产管理文件夹

    5、后台登录接口演示

        开发完成后台接口,编写正确严谨的逻辑代码处理前端请求。此处登录接口代码如下,运行后台开发项目,使该接口能够访问。接口请求路径为:http://localhost:8080/manage/app/user/login

    @Controller
    @RequestMapping("/manage/app/")
    @Scope("prototype")
    public class AppUserController {
    
       /**
        * 日志
        */
    public static Logger customFile = LoggerFactory.getLogger("manageCustomFile");
    
    @Resource
    private AppUserService appUserService;
    
        /**
         * 用户登录
         * @param baseResult
         * @return
         */
        @RequestMapping(value = "user/login" , produces = "application/json;charset=UTF-8", method = RequestMethod.POST)
        @ResponseBody
        public BaseResult loginUser(@RequestBody BaseResult baseResult) {
            customFile.info("appId:"+ baseResult.getTreasureID()+ "用户登陆访问:" + baseResult.toString());
            return appUserService.loginUser(baseResult);
        }
    }

    6、新建接口测试

        在Postman主页面Content部分点击'+'按钮,新增一个接口测试。在图2-6所示第一部分填写接口请求路径,左侧下拉列表可选择请求方式,此处选择POST请求方式。接口请求路径为http://localhost:8080/manage/app/user/login。第二部分是请求体,即包含接口所需请求参数的Body,此处选择原始数据RAW,数据类型使用JSON数据作为请求数据。点击蓝色Send按钮发送请求,后台项目接口接收请求并响应返回执行结果。此处后台处理数据返回结果仍是JSON数据,这个看实际项目而定,此处仅做演示。第三部分是接口响应体,即接口响应请求处理并返回的数据。点击Pretty自动匹配接口返回的数据格式并对数据美化显示,使数据看起来更加直观。如果接口测试出现异常,则可以通过PreView视图查看浏览器响应接口的页面信息,也可以通过Header了解请求状态等参数。一般出现异常还是直接去后台看控制台的异常信息及项目日志来处理解决异常,再进行接口测试。

    图2-6接口测试图

        接口测试通过后,可Ctrl+S保存接口测试实例,填写接口测试名称和接口描述信息,选择要保存的路径,此处保存在user用户管理模块文件夹。当项目的接口全部测试通过后,可在A hundred million项目右键Export导出接口文档,保存为JSON接口测试文件,该文件可通过Postman导入查看。

    三、请求方式

        对于后台开发的接口,请求方式肯定不止POST一种,Postman也支持多种请求方式。在新建接口测试实例时可选择接口的请求方式,如图3-1。

    图3-1接口请求方式图

        请求类型可以模拟Form表单文本提交,Form表单文件提交,raw原始数据提交,二进制文件提交。对于原始数据类型raw还支持不同文件格式,包括JSON,TXT,HTML等多种文件格式。

    图3-2数据请求类型图

     

    四、资金记录接口实例演示

        后台开发接口如下,服务器部署运行后台项目。接口请求路径为:http://localhost:8080/manage/app/user/asset/withdrawRecord

    @Controller
    @RequestMapping("/manage/app/")
    @Scope("prototype")
    public class AppUserAssetController {
     
        /**
         * 日志
         */
        public static Logger customFile = LoggerFactory.getLogger("manageCustomFile");
    
        @Resource
        private AppUserAssetService appUserAssetService;
        
        /**
         * 获取提现记录
         * 即我的页面中的资金记录
         * @param baseResult
         * @return
         */
        @RequestMapping(value = "user/asset/withdrawRecord" , produces = "application/json;charset=UTF-8", method = RequestMethod.POST)
        @ResponseBody
        public BaseResult getUserWithdrawRecord(@RequestBody BaseResult baseResult){
            customFile.info( "appId:"+ baseResult.getTreasureID() + "用户提现记录获取"+baseResult.toString());
            return appUserAssetService.getUserWithdrawRecord(baseResult);
        }
    }

    新建资金接口测试
    请求方式为POST,
    请求URL为http://localhost:8080/manage/app/user/asset/withdrawRecord
    请求体为JSON类型的原始数据
    点击Send请求接口,接口响应请求处理返回结果如图3-3所示


    图3-3资金记录接口测试图
     
    展开全文
  • 接口隔离原则

    万次阅读 多人点赞 2014-07-22 04:01:02
    接口隔离原则 对接口的理解  这里的接口,不是java语言内部的interface的意思,在这里,可以将接口理解为一个类提供的所有的方法的特征集合,通俗点说就是所有可见方法和可见变量(java的说法, c++的说法是可见...

    转载请注明出处!!!http://blog.csdn.net/zhonghuan1992

             所有配套代码均在github上:https://github.com/ZHONGHuanGit/DesignPattern



    跟着ZHONGHuan学习设计模

    接口隔离原则







    对接口的理解

             这里的接口,不是java语言内部的interface的意思,在这里,可以将接口理解为一个类提供的所有的方法的特征集合,通俗点说就是所有可见方法和可见变量(java的说法, c++的说法是可见函数和可见属性元素)。

    接口隔离原则的定义:

    一个类对于另一个类的依赖应当建立在最小的接口上,不应当依赖一些不需要的接口。

     

             从实例中来体会定义。假设我们有两个学生类,文科生和理科生,他们需要考试,我们把考试抽象出一个接口,让不同的实现类来实现。如下图一所示:

            

    图一

         从上面的设计中,我们用代码实现

    /**
     * 考试抽象类
     * 
     * @author zhonghuan
     */
    interface Exam
    {
    	public void chinese();// 考语文
    
    	public void math();// 考数学
    
    	public void physics();// 考物理
    
    	public void geolography();// 考地理
    }
    
    /**
     * 文科生实现考试抽象类,文科生不考物理
     * 
     * @author zhonghuan
     */
    class ExamForLiberalArtStu implements Exam
    {
    	public void chinese()
    	{
    		System.out.println("考语文");
    	}
    
    	public void math()
    	{
    		System.out.println("考数学");
    	}
    
    	public void physics()
    	{
    		// "不考物理", 不用实现, 没有意义
    	}
    
    	public void geolography()
    	{
    		System.out.println("考地理");
    	}
    }
    
    /**
     * 理科生实现考试抽象类,理科生不考地理
     * 
     * @author zhonghuan
     */
    class ExamForScienceStu implements Exam
    {
    	public void chinese()
    	{
    		System.out.println("考语文");
    	}
    
    	public void math()
    	{
    		System.out.println("考数学");
    	}
    
    	public void physics()
    	{
    		System.out.println("考物理");
    	}
    
    	public void geolography()
    	{
    		// 理科生不考地理,不用实现没有意义
    	}
    }
    

             可以看到,设计上,用一个接口来作为父类,可是子类却要实现自己不会没有必要实现的方法,这样的设计显然是不合适的。如果接口过于臃肿,如上面的例子,虽然看上去,你只是多实现了一个方法,但是如果是其它的情况,方法比较多的情况下,是不合适的,那样的接口的过于臃肿会更加明显。

             所以,在设计的时候,应当对接口在整个生命周期中扮演的角色搞清楚,针对上面的实例,考试接口分为两个角色,一个是文科生考试的角色,一个是理科生考试的角色,所以可以将这个接口分为三个接口。

            

    图二

             从图二的设计中,将原来的一个接口分为三个接口,一般考试接口,理科考试接口,文科考试接口,文科生和理科生都可以依赖最小的接口,而不用担心接口臃肿的问题。

         

    /**
     * 考试抽象类
     * 
     * @author zhonghuan
     */
    interface Exam
    {
    	public void chinese();// 考语文
    
    	public void math();// 考数学
    }
    
    /**
     * 理科生考试接口
     */
    interface ScienceExam
    {
    	public void physics();// 考物理
    }
    
    /**
     * 文科生考试接口
     */
    interface LiberalArtExam
    {
    	public void geolography();// 考地理
    }
    
    /**
     * 文科生考试实现类
     * 
     * @author zhonghuan
     */
    class ExamForLiberalArtStu implements Exam, LiberalArtExam
    {
    	public void chinese()
    	{
    		System.out.println("考语文");
    	}
    
    	public void math()
    	{
    		System.out.println("考数学");
    	}
    
    	public void geolography()
    	{
    		System.out.println("考地理");
    	}
    }
    
    /**
     * 理科生考试实现类
     * 
     * @author zhonghuan
     */
    class ExamForScienceStu implements Exam, ScienceExam
    {
    	public void chinese()
    	{
    		System.out.println("考语文");
    	}
    
    	public void math()
    	{
    		System.out.println("考数学");
    	}
    
    	public void physics()
    	{
    		System.out.println("考物理");
    	}
    }
    

     

            接口隔离原则的含义是:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。也就是说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。在上面的例子中,原本依赖于一个大的抽象接口,改为依赖于3个更细化的抽象接口,可以避免接口的污染.

    使用接口隔离原则的注意事项

             1接口尽量小,尽量遵循接口隔离原则,不要意图构建一个万能接口。

             2设计接口时,应根据实际情况分析,尽可能设计小的接口,为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。

             3提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。

    在以后的应用中慢慢去掌握这个原则,在后面的设计模式中,我们还会重温这个原则。

    展开全文
  • 六大设计原则之接口隔离原则

    千次阅读 2016-08-24 21:20:55
    接口隔离原则定义接口隔离有两种定义: Clients should not be forced to depend upon interfaces that they don’t use. 客户端不应该依赖它不需要的接口 那依赖什么呢?依赖它需要的接口,客户端需要什么接口就...
  • 面向对象设计原则之接口隔离原则

    万次阅读 多人点赞 2012-05-13 19:54:28
    接口隔离原则定义如下: 接口隔离原则(Interface Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。   根据接口隔离原则,当...
  • 面向对象设计原则之5-接口隔离原则

    万次阅读 2018-07-15 18:40:18
    接口隔离原则(Interface Segregation Principle or ISP) 客户端不应该依赖它不需要的接口。 ISP:Clients should not be forced to depend upon interfaces that they don’t use. 一个类对另外一个类的依赖性...
  • 面向对象其它六大原则 单一职责原则-带你走梦幻西游(一) 依赖倒置原则(二) 开闭原则(三) 迪米特原则-带你走进梦幻西游(四) 里氏替换原则(五) 定义 客户端不应该依赖它不需要的接口;一个类对另一个类...
  • 接口隔离原则的定义

    千次阅读 2014-11-07 13:44:41
    接口隔离原则的定义  在讲接口隔离原则之前,先明确一下我们的主角——接口。接口分为两种:   ◇ 实例接口(Object Interface),在Java中声明一个类,然后用new关键字产生的一个实例,它是对一个类型的事物...
  • 设计模式六大原则(4):接口隔离原则

    万次阅读 多人点赞 2012-02-27 08:32:29
    定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。 问题由来:类A通过接口I依赖类B,类C通过接口I...也就是采用接口隔离原则。 举例来说明接口隔离原则: (图1 未遵循接
  • ISP(Interface Segregation Principle),接口隔离原则   它要求如下: ① 一个类对另一个类的依赖性要建立在最小接口上。 ② 使用多个专门的接口比使用单一的总接口要好。 ③ 没有关系的接口不可合并成一个...
  • 六大设计原则-接口隔离原则

    千次阅读 2020-03-26 15:28:59
    接口隔离原则 客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。简单的来说就是要为各个类建立它们所需要的专用接口,而不要建立一个很庞大的接口,供所有依赖它们的类去调用。 ...
  • 面向对象六大原则——接口隔离原则

    万次阅读 多人点赞 2018-08-13 10:54:15
    什么是接口隔离原则(Interface Segregation Principle, ISP)  接口对于Java开发者来说都不陌生,它几乎存在于每一个Java程序中,是抽象的代名词。在讲接口隔离原则之前,先说说接口,接口分为以下两种: - 实例...
  • 面向对象的原则之接口隔离原则

    千次阅读 2016-09-21 13:36:32
    接口隔离原则 设计应用程序的时候,如果一个模块包含多个子模块,那么我们应该小心对该模块做出抽象。设想该模块由一个类实现,我们可以把系统抽象成一个接口。但是要添加一个新的模块扩展程序时,如果要添加的模块...
  • 我的女朋友小肉是一名光荣的辅导班老师,说来惭愧,我上初中那会儿最讨厌辅导班老师了,每天上学都这么累了,晚上还得去见辅导班老师,神烦,奈何目前的教育机制下,很多家长认为辅导班是提高成绩比较靠谱的方式,...
  • 如何理解接口隔离原则

    千次阅读 2017-02-08 11:11:39
    接口隔离原则: 客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。 (图片来自网络) 见上图,该把接口细分到3个接口中去,保证每个类都只实现它需要的接口。 接口隔离原则与单一...
  • Java设计模式-接口隔离原则

    千次阅读 2019-03-11 08:40:15
    接口隔离原则 【Interface Segregation Principle】   定义1:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上(Clients should not be forced to depend upon interfaces that ...

空空如也

1 2 3 4 5 ... 20
收藏数 1,178,430
精华内容 471,372
关键字:

接口隔离原则