抽象类?这个东西我感觉没什么卵用啊,又不能拿来new对象,没有具体的对象的抽象类,有什么实际的意义呢?这是很多刚刚接触java抽象类语法时的第一反应(当然,包括我)。确实,很多刚刚接触抽象类这个概念的程序员都无法真正理解抽象类存在的意义,感觉java中的这个专门只能拿来继承并实现了对应抽象方法才能真正有那么一点用处的父类确实有点多余。

确实,如果你只是一个应用开发者(当然,是指简单地实现业务功能),或许你永远也不用抽象类,因为,它本来就不是拿来当具体的应用功能开发用的类,它是用来实现传说中的架构建模用的,没错,就是这个简答的抽象类,是架构师构建大型架构必不可少的工具,废话不多说,下面我们一起感受抽象类在架构设计中的威力(当然,真正的 威力肯定比我描述的强大得多,毕竟,目前我对抽象类的架构建模思想也是懂点皮毛,或许皮毛都不算)

一、具体类实现功能

  在讨论抽象类前,我们先简单地讨论具体类的一些例子,以便和抽象类进行对比,好了,首先看一个很稀松例子:

//一个简单的汽车类
class Car{
//该类有以下方法 //点火方法
public void fire(){
System.out.println("我是汽车,给我点火,我的发动机会开始转动");
} //驾驶方法
public void run(){
System.out.println("我是车,我现在在驾驶,注意,我和倒车不同,我是向前走");
}
//倒车方法
public void backCar(){
System.out.println("我是车,我现在在倒车,注意,我和驾驶不同,我是向后走");
} //现在有一个动作:放置好车辆(好吧,这个说法有点牵强,只是为了说明例子,别太在意)
public void setCar(){
//首先,你要对车点火才能驱动车行驶,才能将车放到车库(原谅我这里的不面向对象,一切只为说明问题实质)
fire();
//恩,向前走,去到车库
run();
//ok,我要倒车入库了
backCar();
//...当然,后续其他操作:熄火啊什么的
}
}

好吧,代码有点长,可能你现在一脸懵逼不知道我为毛举一个这么脑残的例子(稍后估计你就明白了),这里的代码就是我们平时很多时候编程的大概思维方式:类方法内部调用其他方法,而且这个类是具体的,方法也是具体的,我们当时想的只是:我要事先车这个功能,例如说,我只是要倒车入库,我现在实现了,那就行啦,这样代码运行的不错,恩,我们开始沾沾自喜,感觉自己干了件大事,觉得java程序设计不过如此,简单啦。

确实,上面这个例子,在现阶段,很好地实现了我们需要的功能,然而,然而,估计你是个程序员,你就会知道,需求,一直在变,程序也要一直变,正如我的上一篇讨论设计模式的博客说到:我们要保证我们的设计具有可扩展性。

所以,看看我们上面这个例子的可扩展性如何:加入,我的车不是普通的车,我的车是宝马,宝马啊,他妈的怎么能和普通车一样?我的run方法可是时速超过200km的,你怎么能只是简单地说我只是在往前走地描述我的驾驶状态?所以,这是候,上面的代码没辙了,只能新建一个BMW类,然后乖乖地继承car类,然后乖乖地重写所有方法,然后,你会发觉:这个更高级别的car存在的意义似乎并不大?下面是继承后的BMW类的代码:

class Bmw extends Car{
//我是宝马,我的点火方法与众不同
public void fire(){
System.out.println("我是宝马,给我点火,我的发动机会开始转动,并且哥点火时的气势可不是那些普通车可比的");
} //宝马驾驶方法
public void run(){
System.out.println("我是宝马,我现在在驾驶,注意,我是在飞奔驾驶,别将我和那些垃圾普通奇瑞qq类比");
}
//宝马倒车方法
public void backCar(){
System.out.println("我是车,我现在在倒车,因为我是宝马,倒车姿势肯定也不是一般酷");
} //现在要放好我的宝马车了
public void setCar(){
//首先,轰轰,点火
fire();
//恩,向前飞奔,注意,是飞奔
run();
//ok,我要倒车入库了
backCar();
//...当然,后续其他操作:熄火啊什么的
}
}

所以,作为程序员的你开始抱怨:为毛感觉父类在这里没什么作用了?它作用表现在哪?我还不是要重新全部方法覆盖一遍!所以,这时候,抽象类的威力就出来,下面看用抽象类改造后的例子;

二、抽象类进行更高层次的建模

  先看利用抽象类进行更高层次的建模吧,估计看完代码你就大概能领悟抽象类再架构设计中是大概如何发挥作用的了:

//我是一个抽象的汽车类,注意,是抽象的
abstract class car{
//和上面例子一样,我有下面这些方法,只不过,部分方法抽象化了
public abstract void fire();
public abstract void run();
public abstract void backCar();
//然后,下面这个方法不是抽象的(是的,java抽象类允许非抽象方法存在),因为,它对应所有的car都适用(也是高层次进行动作抽象的表现)
public void setCar(){
//我调用抽象方法,不用担心,这些抽象方法会在子类中实现!
fire();
run();
backCar();
}
}

好了,有没有领会到我大概要表达的意思和传递的思想了呢:在上面中,我就是利用car的抽象类,定义了setCar的具体方法,这是因为对应所有车来说setCar都是这几个动作(fire,run,backCar),所以,这是确定的——setCar必须肯定是调用这几个方法的,所以具体化;而fire,run,backCar针对不同的车有不同的方式,所以要抽象化,然后,子类只需要实现抽象类具体方法就行了,然后,对于所有的car来说,我们可以复用父类的setCar代码(毕竟所有车的setCar动作一样),而,这,不就是基础的好处了吗?好了,看下面的BMW家伙在利用抽象类进行建模后的改进写法:

class Bmw extends car{
public void fire() {
System.out.println("我是宝马,给我点火,我的发动机会开始转动,并且哥点火时的气势可不是那些普通车可比的");
} public void run() {
System.out.println("我是宝马,我现在在驾驶,注意,我是在飞奔驾驶,别将我和那些垃圾普通奇瑞qq类比");
}
public void backCar() {
System.out.println("我是车,我现在在倒车,因为我是宝马,倒车姿势肯定也不是一般酷");
}
//然后,我们就可以直接复用car父类中的setCar方法啦!直接调用即可,达到了复用代码的目的!
}

这时,估计你应该能体会到抽象类的一些威力了吧?它在更高的层次进行一个类组织的规范,这个抽象类知道大体上这个类该如何组织,如何运行,但是运行细节其实子类来决定的(子类实现对应抽象方法),这些,不正是很多web框架设计的常用手段吗!

所以,架构就这样来了,架构师在更高层次抽象系统的类之间、类内部的调度关系,而实现开发人员只需要实行具体的方法就可以了,毕竟,类之间的关系,架构师已经规划好了。

另外,这样还有另外的好处就是:扩展性。我想新增一种车,只需要基础抽象类Car即可,setCar操作会根据我新的类型的car的方法进行不同的内部动作,而我原来的代码并不需要一点点的改变!这样,符合扩展的不修改源代码而利用新增代码达到扩展的原则。

So,抽象类,的确,很不错是吧,毕竟,虽然它不是具体的执行者(不能new),但是,它充当的确实帝王角色,专门负责指挥具体的方法去做事,所以我认为:抽象类的设计,就是一套系统的架构规范的设计!

java设计模式--基础思想总结--抽象类与架构设计思想的更多相关文章

  1. Java进阶专题(十八) 系统缓存架构设计 (下)

    前言 上章节介绍了Redis相关知识,了解了Redis的高可用,高性能的原因.很多人认为提到缓存,就局限于Redis,其实缓存的应用不仅仅在于Redis的使用,比如还有Nginx缓存,缓存队列等等.这 ...

  2. java 微信红包算法代码实现及架构设计

    转载至:https://www.zybuluo.com/yulin718/note/93148 微信红包的架构设计简介 架构 @来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈 ...

  3. java设计模式--基础思想总结--父类引用操作对象

    看设计模式的相关书籍也有一段时间了,一开始其实是抱着作为java三大框架的基础知识储备来学习的,不过到后来,才发现,在设计模式的一些准则装饰下,java的面向对象威力才真正地体现出来,后面的将会陆续地 ...

  4. 看完这篇微服务架构设计思想,90%的Java程序员都收藏了

    本博客强烈推荐: Java电子书高清PDF集合免费下载 https://www.cnblogs.com/yuxiang1/p/12099324.html 微服务 软件架构是一个包含各种组织的系统组织, ...

  5. java面试基础题------》抽象类和接口有什么异同

    划重点!!!! 1.抽象类(abstract class)和接口(interface)有什么异同? 相同点 * 都不能被直接实例化,都可以通过继承实现其抽象方法. * 都是面向抽象编程的技术基础,实现 ...

  6. java设计模式基础 - 解决某一类问题最行之有效的方法,框架是大的设计模式.

    一.单例模式(Singleton) 1.单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1>某 ...

  7. java面向对象基础(四):抽象类和接口

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  8. Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战

    Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战 Java生鲜电商平台-  什么是秒杀 通俗一点讲就是网络商家为促销等目的组织的网上限时抢购活动 比如说京东秒杀,就是一种定时定量秒杀,在规定 ...

  9. Java设计模式—单例设计模式(Singleton Pattern)全然解析

    转载请注明出处:http://blog.csdn.net/dmk877/article/details/50311791 相信大家都知道设计模式,听的最多的也应该是单例设计模式,这种模式也是在开发中用 ...

随机推荐

  1. 8、insert、delete、update语句总结

    insert常用语句 > insert into tb1 (name,age) values('tom',33); > insert into tb1 (name,age) values( ...

  2. iOS 设备定位功能可用的判断

    if ([CLLocationManager locationServicesEnabled] && ([CLLocationManager authorizationStatus] ...

  3. 关于在iOS应用中跳转到AppStore

    1.获取app 在AppStore上的网址 eg: NSString * appURLStr = @"https://itunes.apple.com/cn/app/shi-ke-zu-qi ...

  4. python为何需要虚拟环境--Python虚拟环境的安装和配置-virtualenv

    一 虚拟环境 virtual environment 它是一个虚拟化,从电脑独立开辟出来的环境.通俗的来讲,虚拟环境就是借助虚拟机docker来把一部分内容独立出来,我们把这部分独立出来的东西称作“容 ...

  5. Elasticsearch 因拷贝多余的jar到lib库导致无法启动的问题

    因为需要测试,无意中拷贝了一个netty-buffer-4.1.16.Final.jar包放到es的lib目录下,晚上回家启动es的时候发现启动不起来了.检查日志发现如下错误. 其中有一句关键语句 C ...

  6. 【Leetcode】Binary Tree Traversal

    把三个二叉树遍历的题放在一起了. 递归写法太简单,就不再实现了,每题实现了两种非递归算法. 一种是利用栈,时间和空间复杂度都是O(n). 另一种是借助线索二叉树,也叫Morris遍历,充分利用树中节点 ...

  7. selenium+python+unittest:一个类中只执行一次setUpClass和tearDownClass里面的内容(可解决重复打开浏览器和关闭浏览器,或重复登录等问题)

    unittest框架是python自带的,所以直接import unittest即可,定义测试类时,父类是unittest.TestCase. 可实现执行测试前置条件.测试后置条件,对比预期结果和实际 ...

  8. 利用java实现一个简单的链表结构

    *博客搬家:初版发布于 2014/07/04 定义: 所谓链表就是指在某节点存储数据的过程中还要有一个属性用来指向下一个链表节点,这样的数据存储方式叫做链表 链表优缺点: 优点:易于存储和删除 缺点: ...

  9. JAVA数据结构--哈希表的实现(分离链接法)

    哈希表(散列)的定义 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度 ...

  10. Go语言fmt包详解

    格式化输出函数 fmt包含有格式化I/O函数,类似于C语言的printf和scanf.格式字符串的规则来源于C,但更简单一些 1.print和println方法 print输出给定的字符串,如果是数值 ...