Java设计模式随笔
大家都知道Java23种设计模式,大神总结如下:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
各种设计模式的原理和要点大神zhangerqing的原创博文系列已有讲解,贴一下,遗忘了就去复习
http://blog.csdn.net/zhangerqing/article/details/8194653 【Java之美[从菜鸟到高手演变]之设计模式】创建型模式
http://blog.csdn.net/zhangerqing/article/details/8239539 【Java之美[从菜鸟到高手演变]之设计模式二】结构型模式
http://blog.csdn.net/zhangerqing/article/details/8243942【Java之美[从菜鸟到高手演变]之设计模式三】行为型模式
http://blog.csdn.net/zhangerqing/article/details/8245537【Java之美[从菜鸟到高手演变]之设计模式四】行为型模式二
设计模式的六大原则:
1、开闭原则(Open Close Principle)开闭原则就是说对扩展开放,对修改关闭。
2、里氏代换原则(Liskov Substitution Principle)里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。
3、依赖倒转原则(Dependence Inversion Principle)这个是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则(Interface Segregation Principle)这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。
5、迪米特法则(最少知道原则)(Demeter Principle)一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则(Composite Reuse Principle)。原则是尽量使用合成/聚合的方式,而不是使用继承。
人们总结以上设计模式的原则主要从工作经验中来,考虑如下两点:
一、扩展性。扩展性可谓当前企业级项目必备,个人项目做实验或兴趣扩展性可能在易编程性之后,想要尽快做出东西,看看效果玩一玩。企业级项目可不同,一定是针对直接客户的需求为目标,而且这个需求会随着调研深浅和市场竞争有很大差异,目前中国市场竞争之激烈,一个小项目第一个月调研出来的结果可能是两个核心需求,第二个月就会多出有上十个配套需求了,在系统上线半年之后还可能有好几个补充需求。那么这个项目无论从架构上还是功能模块上,都需要具备很好的扩展性。
依赖倒转原则非常明显的,就是为了支持扩展。合成复用原则一定程度上希望类的函数功能细粒化,才能提高可复用性,也就更易于扩展。
二、稳定性。一个项目上线对外提供服务,出现故障一般有几种情况:编程质量不高导致内存泄漏或运行缓慢,网络带宽/数据库/服务器硬件性能导致系统崩溃,还有就是更新版本导致性能或功能问题。由于扩展性里所说的高速发展的业务场景下,版本频繁迭代产生的问题比前两种要常见得多,而且更为严重。本身没有什么大漏洞的系统,由于更新版本出现功能性漏洞的情况屡见不鲜。如何避免这类问题,其实就是新功能不要影响旧功能,那怎么样新功能才不会影响旧功能呢?利用Java的继承的接口实现特性,尽量不要去改现有的类,即使要改现有的类,也不要去改现有的函数,而是使用新的类和新的函数去实现新功能。
一定程度上来讲,开闭原则增强了系统的稳定性,减少版本迭代出现的问题,另一方面也使得代码越来越臃肿,项目更迭了几年之后没有什么用处的代码随处可见,这些没用的代码不用也就算了,还可能有大量预编译和静态加载等等,增加了编译时间,也降低了运行效率,甚至增加系统压力。一般的项目代码几十M上百M了不得,一线公司很多项目的源码甚至上GB级别,不是因为实际的功能繁多到必须编写这么多代码,而是因为没人敢动老的代码。总的来说,开闭原则还是利大于弊的。
迪米特法则也希望每个功能模块之间尽量独立,减少耦合,在版本更迭时不至于影响扩大或者存在太多不确定性。