前言
设计模式有很多,但设计模式的目的是一致的,都是为了提升代码的可读性和可扩展性。设计模式都遵循一些基本的原则,设计模式是为了遵循这些原则而创造的工具。
- 单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。这一点是说,如果有一些类过于臃肿,承担了过多的职责,就应当分解他。
- 开放-封闭原则:软件实体(类、模块、函数等)应该可以扩展,但是不可修改。这一点是说,拒绝硬编码,拒绝直接修改原有代码。
- 依赖倒转原则:高层模块不应该以来低层模块。两个都应该以来抽象。抽象不应该依赖细节。细节应该依赖抽象。这一点是说,应该使用面向接口编程。
这些原则是程序员在协同工作中达成的共识,就算大家从来没有学习过什么设计模式,只要能遵循这些原则,也许你自己已经使用了某些设计模式。
有三个模式我以前学习的时候很混淆,他们是策略模式、代理模式、装饰者模式。混淆的原因是,这三个模式都是在 辅助类中持有一个目标类的对象,通过操作这个目标对象,完成实际任务。
在工作中具体场景下深入思考以后,我终于对他们有了进一步的理解。
首先来看策略模式,uml类图如下
策略模式通过将一些易变的计算抽象为策略实体,通过多态,让实际调用者尽可能的不用感知这种变化。
再看代理模式
代理模式与策略模式不同的是,代理类必须和被代理类具有相同的父类或接口,即代理类要么继承或实现被代理类的父类,要么直接计程被代理类本身。这两种情况分别对应java的jdk代理和cglib代理实现。
代理模式不是为了封装变化,而是为了隐藏实际执行者本身。
最后是装饰者模式
装饰者模式和策略模式的不同在于,原有类和装饰器类必须继承同一个父类。装饰器对象除了需要完成持有对象的操作外,还有一些附加操作,这些附加操作随着装饰器的不同而变化。持有对象本身的操作是主体,装饰器的操作是补充。而策略模式中,具体策略才是主体。