设计模式OOP(面向对象编程)语言的一些最佳编程实践。这些从大量和长期的软件开发实践和试错中积累出来的通用解决方案(设计模式),往往能够解决软件开发面临的一些通用问题。
设计模式从何而来?在1994年,Erich Gamma, Richard Helm, Ralph Johnson 和 John Vlissides(也就是如雷贯耳的GOF-Gang of Four)初版了一本名为《设计模式——面向对象软件的可复用元素》(Design Patterns - Elements of Reusable Object-Oriented Software),书中首次提到了软件开发的设计模式概念。
根据《设计模式》作者所说,设计模式主要基于下面两个面向对象设计的原则而产生:
- 面向接口编程而不是面向实现编程
- 对象组合优于对象继承
设计模式有用吗?之后在我们的实际的设计模式类图中,仍然会看到继承的出现,但有别于典型的通过继承获得父类的能力,而更多是通过继承来完成实际意义上的组合
设计模式在软件开发过程中主要有两方面的用途:
- 便于开发者建立统一的沟通方式
设计模式为特定的场景提供了标准的技术方案。比如,单例模式就是意味着使用一个单独的对象,所有熟悉单例模式的开发者都会采用单例模式,并且对外介绍的时候只要简单说一句,我用的是单例模式就可以了。
- 最佳实践
设计模式是从长期软件开发中演化而来,为解决特定问题提供了很好的解决方案。学习设计模式能够让出入软件开发的工程师也能够很好的进行软件设计,这个过程简单快速而且相对可靠。
设计模式有哪些类型?在《设计模式》中总共提到的三种类型的设计模式:创建型、结构型和行为型。三种大类下又分别包含若干具体的设计模式,加起来共23种设计模式。不过,后面如果有机会,我们也会讨论到一种设计模式叫:JavaEE设计模式。
我们通过一个表格来介绍一下这些设计模式:
设计模式类型 | 设计模式 |
---|---|
创建型: 提供创建对象的方式并且屏蔽创建逻辑,而不是直接new对象。 目的是为对象的创建提供更多的灵活性,满足不同场景的需要。 | 工厂模式(Factory) 抽象工厂模式(Abstract Factory) 单例模式(Singleton) 建造者模式(Builder) 原型模式(Prototype) |
结构型: 关注类和对象的组合。在该类型设计模式中,继承被用于组合接口, 或者把对象组合起来以获得新的方法(或能力)。 | 适配器模式(Adapter) 桥接模式(Bridge) 过滤器模式(Filter、Criteria) 组合模式(Composite) 装饰器模式(Decorator) 外观模式(Facade) 享元模式(Flyweight) 代理模式(Proxy) |
行为型: 主要关注对象间的通信 | 责任链模式(Chain of Responsibility) 命令模式(Command) 解释器模式(Interpreter) 迭代器模式(Iterator) 中介者模式(Mediator) 备忘录模式(Memento) 观察者模式(Observer) 状态模式(State) 空对象模式(Null Object) 策略模式(Strategy) 模板模式(Template) 访问者模式(Visitor) |
JavaEE: 关注展现层的设计, 该设计模式是被JavaEE框架的制定者(Sun公司)最先定义出来的。 | MVC 模式(MVC) 业务代表模式(Business Delegate) 组合实体模式(Composite Entity) 数据访问对象模式(Data Access Object) 前端控制器模式(Front Controller) 拦截过滤器模式(Intercepting Filter) 服务定位器模式(Service Locator) 传输对象模式(Transfer Object) |
在后续的章节中,我们将逐个介绍各个具体的设计模式,尤其是他们的应用场景、类图设计、示例代码等。
设计模式是完美的吗?
就好像软件世界中的经典语录——XXX不是银d,设计模式同样可以套用一下——设计模式不是银d。
好的设计好代码包括对业务的准确表达,要兼顾未来(这个未来可长可短)的扩展性和维护性,要充分考虑成员的理解水平。所以就像上图表达的一样,哪怕我们用上了各种软件原则、各种设计模式,也未必是是最好的选择。
当然我们不会因此就放弃设计模式的学习和使用,它是一把上好的武器,只有理解了它,在合适的时候,我们才能让它绽放光彩!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)