很多刚接触面向对象的时候总是觉得继承,接口实现会把人弄晕。但是到后来写的代码多了,觉得自己定义一个类就足够用了,越来越觉得继承,接口实现越来越多余。
如果你看到这篇文章的时候如果你有上面的想法的时候,那么你只是所做的项目或许就只是登录,注册,查询一个列表,或者是所用写的代码不多。如果你的项目功能不断变多,而所写的代码越来越多,而在写的过程中不断的去变化的时候,你会发现按照之前的方法来写,你会写很多很多的重复代码,而且如果重复的代码涉及到简单的逻辑需要修改的时候,那么你必须在重复出现的地方去不断的修改。
设想一下如果有很多功能都有相同的代码,何不写在一个地方,要改就改一个地方。可能此时有人有会说我在一个类中定义一个方法,来把这些重复的代码拿来用,会有一样的效果啊。此时你假设一个情景:你一直把一件事情交给其他人做,但突然有一天那个人不做了,你这个事情不是就没法完成了,所以还是亲力亲为最好,把这个本事变成自己的才是最好的,有本事走遍天下。
所以这里就是继承的作用来了。所谓继承想必我也不用多说太多,学基础的时候我们都知道,就是把父类中的东西变成自己的。只要你明白这一点就很好。下面举一个实际开发中的例子,则能更清楚的说明白继承的好处。
我们在struts2中会去定义很多的Action,在Action中如果我们要使用到HttpSerlvet的接口,那么我们会在每个类中去实现相应的接口,同时Action必须要继承ActionSupport,那么是不是我们每写一个Action就去做这些呢?正如刚才所说,只有一两个Action没有问题,但是如果很多我们何不这样呢:
- public class BaseAction extends ActionSupport implements ServletContextAware,
- ServletResponseAware, ServletRequestAware, SessionAware {
- private static final long serialVersionUID = 1L;
- protected ServletContext servletContext;
- protected HttpServletRequest httpServletRequest;
- protected HttpServletResponse httpServletResponse;
- protected HttpSession httpSession;
- protected Map<String, Object> session;
- public void setServletContext(ServletContext context) {
- this.servletContext = context;
- }
- public void setServletResponse(HttpServletResponse response) {
- this.httpServletResponse = response;
- }
- public void setServletRequest(HttpServletRequest request) {
- this.httpServletRequest = request;
- this.httpSession = request.getSession();
- }
- public void setSession(Map<String, Object> session) {
- this.session = session;
- }
- }
在这里我们定义一个Action而这个Action不去做任何的事情,只是去得到这些必要的属性。想想,以后我们定义新的Action的时候我们只要去继承这个Action那么里面的属性我们就都存在了,不用我们去写更多相同的代码。同时如果我们以后要在每个Action中添加一个字段来作为返回的标识(如果有需要的情况下),那么我们也只用在这个类中加一个字段,则每个继承了这个类的Action都可以拥有该属性了。及便于我们维护,同时也少写了很多的重复代码。
继承的最简单的用法就在此,可以以此类推。如果有兴趣去看看JDK的源码,我们在平时所用到的很多接口,类都是不断去继承父类,然后不断的扩展开来的。
而对于接口,我听过一个例子:我们现在用的USB接口,不同的厂商所做的USB接口内部肯定有不一样,而为什么这样我们的USB能在很多地方都通用呢?这个就是接口的设计。
接口,我们定义他的方法名称,参数列表,只要你使用我的接口,我就能给你提供服务。在我们平时的开发中也一样,我们的很多服务都可以通过接口来完成。比如我们的登陆功能,那么我定义一个登陆接口,我们在Action中只用去调用这个接口,传递需要的参数,明确他的返回值。而对于方法的内部我们不用去过多的关心。
正由于他的内部我们不用去关心,因此假如有一天我们需要在登录的服务接口内部添加查询用户是否是在黑名单中,那么我们只用在接口的实现类里面去加入这个功能,而在Action中,我们不用去修改任何的代码。
其实很多用过SSH的人,都应该对接口很熟悉,而且是鼓励接口编程,所以接口我在这里也就不多说了。如果我们能将继承和接口两个特性融合起来,那么我们的程序的可扩展性和可维护性就会变得越来越高,同时耦合度也会变得越来越小。
转载于:https://blog.51cto.com/sgyyz/1031006