设计模式主要是基于以下的面向对象设计原则。
对接口编程而不是对实现编程。
优先使用对象组合而不是继承。
设计模式分类:
设计模式的六大原则
1、开闭原则(Open Close Principle)
开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。
2、里氏代换原则(Liskov Substitution Principle)
里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
3、依赖倒转原则(Dependence Inversion Principle)
这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则(Interface Segregation Principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。
5、迪米特法则,又称最少知道原则(Demeter Principle)
最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则(Composite Reuse Principle)
合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。
Factory模式
这个模式可能是是个人都知道的模式。这个模式在现实社会中就像各种工厂一样,工厂跨界的不多,基本上都是在生产同一类的产品,有的生产汽车,有的生产电视,有的生产衣服,有的生产卫生纸……基本上来说,一个生产线上只有做同一类的东西。这和Factory模式很相似。编程中,像内存池、线程池、连接池等池化技术都是这个模式,当然,Factory给你的一个对象,而不单单只是资源,factory创建出来的对象都有同样的接口可以被多态调用。这其实和Unix把所有的硬件都factory成文件一样,并提供了read/write等文件操作来让你操作任意设备的I/O。
Abstract Factory模式
抽象工厂这个模式是创建一组有同一主题的不同的类。这个模式在现实社会当中也有很多例子,比如:
移动公司的合约机计划,88套餐(通话100分钟,短信100条,彩信,20条,上网200M),128套餐(通话200分钟,短信150条,彩信50条,上网500M)……
家里的装修,总是要有厨卫,有门,有灯,有沙发,有茶几,有床,有衣柜,有电视,有冰箱,有洗衣机……,这些都是必需的,只是每个家庭里的具体装修不一样。
Diablo游戏中的Normal,Hard,Nightmare,Hell模式,这些模式的怪和场景和故事情况都差不多,就是每个场景的怪物和装备的属性不一样。或是WarCraft中的地图就是一个Abstract Factory模式(注:Warcraft的地图什么都能干)。这和学校中的小学,初中,高中,大学差不多,都是一样的学习环境,一样的教学方式,一样的教室,都要期中考和期末考,都有班长和科代表,就是学的东西的难度不一样,但基本上都是语文、英语、数、理、化。学校就是一个抽象工厂。
这就是抽象工厂的业务模型(或是:Business Pattern),你觉得是不是不一定非要用OO来实现这样的模式?(我们思考一下,我们会不会被先入为主了,觉得不会OO都不知道怎么实现了),不用OO,用相同格式但内容不同的配置文件是不是也能实现?在Unix下,抽象工厂这个模式在Unix下就像是/etc/rcX.d下的那些东西,1代表命令行单用户,2代表命令行多用户,3代表命令行多用户完整模式启动,5代表图形界面启动,0代表关机,6代表重启,你要切换的话,init
Prototype模式
原型模式,复制一个类的实现。这个模式在现实中的例子也有很多:传真,复印,都是这个模式。Unix进程和Github项目的Fork就是一种。进程fork明显不是OO的模型(参看:关于Fork的一道面试题)。用非OO的方法同样可以实现这个模式。
Singleton模式
单例模式。生活中,公司只有一个CEO,法律限制你只能有一个老婆,你只能有一个身份证号,一个TCP端口只能被一个进程使用,等等。软件开发方面,并不一定只有OO才能做到,你可以用一个全局变量,一个中心服务器,甚至可以使用行政手段来约束开发中不会出现多个实例。Unix下实现单例进程的一个最常用的实践是在进程启动的时候用“(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)”模式打开一个“锁文件”。
Adapter模式
适配器模式。可以兼容欧洲美国中国的插头或插座,万能读卡器,可以播放各种格式多媒体文件的插放器,可以解析FTP/HTTP/HTTPS/等网络协议的浏览器,可以兼容各大银行的银联接口、支付宝、Paypal、VISA等银行接口,可以适配各种后端的解释器的Nginx或Apache,等等。用非OO的编程方式就是重新包装成一个标准接口。这个模式很像Unix下的/dev下的那些文件,操作系统把系统设备适配成文件,于是你就可以使用read/write来进行读写了。
Bridge模式
桥接模式。这个模式用的更多,比如一个灯具可以接各种灯泡或灯管,一个电钻可以换上不同的钻头来适应不同的材料,一辆汽车可以随时更换不同的轮胎来适应不同的路面,你的桌面可以随时更换一个图片来适应你的心情,你的单反相机可以更换不同的镜头来拍不同的照片…… 桥接模式说白了就是组件化,模块化,可以自由拼装。在OO中,其主要是通过让业务类组合一个标准接口来完成,这在非OO的程序设计中用得实在是太多了,主要是通过回调函数或是标准接口来实现。这个也是Unix设计哲学中的主要思想。在Unix中,文件的权限使用的就是Bridge模式,标准接口是用户,用户组和其它,rwx三个模式,然后用 chmod/chown改一改,这文件就有不同的属主和属性了。
Decorator模式。
装饰模式。这个模式在生活中太多了,你给你的手机或电脑贴个什么, 挂个什么,吃东西的时候加点什么佐料,多点肉还是多个蛋,一个Unix/Linux命令的各种参数是对这个命令的修饰,等等。我觉得这个模式在Unix中最经常的体现就是通过管道把命令连接起来来完成一个功能,比如:ps -elf 是列进程的,用管道grep hchen就可以达到过滤的目的,grep的逻辑没有侵入ps中,grep修饰了ps,但是其组合起来完成了一个特定的功能。可见,这和OO没有什么关系。
Facade模式
这个模式我们每个人从会编程的时候就在无意识地用这个模式了。这个模式就是把一大堆类拼装起来,并统一往外提供提口。在现实生活中这样的例子太多了,比如:旅行社把机票,酒店,景点,导游,司机,进店打了一个包叫旅行;IBM把主机、存储、OS、J2EE、DB、网络、流程打了个包叫企业级解决方案。Unix中最典型的一个例子就是用Shell脚本组合各种命令来创造一个新的功能,这是的Shell中的各种命令通过标准I/O这个接口进行组合交互。
参考资料:http://www.infoq.com/cn/news/2013/02/chen-design-pattern/
此文章为转载文章,如涉及侵权。请联系我删除。