对拓展开放,对修改关闭
,大概意思就是如果你需要修改一个类的行为,请继承,或者组合等方式进行拓展修改,不要直接修改,这样会破坏原来代码的行为。设计原则 | 一句话归纳 | 目的 |
---|---|---|
开闭原则(OCP) (Open-Close) |
对扩展开放,对修改关闭 | 减少维护带来新的风险 |
依赖导致原则(DIP) (Dependence Inversion) |
高层不应该依赖底层 | 更利于代码结构的升级扩展 |
单一职责原(SRP) (Simple Responsibility) |
一个类只干一件事情 | 便于理解,提高代码可读性 |
接口隔离原则(ISP) (Interface Segregation) |
一个接口只干一件事情 | 功能解耦,高聚合,低耦合 |
迪米特法则(LoD) (Law of Demeter) |
不该知道的不要知道 | 只有朋友交流,不和陌生人说话,减少代码臃肿 |
里氏替换原则(LSP) (Liskov Substitution) |
子类重写方法功能发生改变,不应该影响父类方法的含义 | 防止继承泛滥 |
合成复用原则(CAPP) ) |
尽量使用组合实现代码复用,而不使用继承 | 降低代码耦合 |
《Design Pattern:Elements of Resusable Object-Oriented Software》(即后述,《设计模式》一书)
由Erich Gamma,Richard Helm, Ralph Johnson 和 John Vlissides 合著(Addison-Wesley 1995)
这几位作者常被成为“四人组”(Gang of Four),而这本书被称为“四人组”(或者GoF)书。
设计模式 | 一句话归纳 | 目的 | 生活案例 | 框架源码举例 |
---|---|---|---|---|
工厂模式(Factory) | 产品标准化,生产更高效 | 封装创建细节 | 食品工厂 | LoggerFactory、Calender |
单例模式(Singleton) | 世界上只有一个我 | 保证对象在应用中唯一性 | 太阳 | BeanFactory、Runtime |
原型模式(Prototype) | 把一根猴毛,吹出千万个 | 高效创建对象 | 克隆 | ArrayList,PrototypeBean |
建造者模式(Builder) | 高配中配与低配,随心配 | 开放个性化配置步骤 | 适配 | StringBuilder、BeanDefinitionBiuilder |
设计模式 | 一句话归纳 | 目的 | 生活案例 | 框架源码举例 |
---|---|---|---|---|
代理模式(Proxy) | 媒婆 | ProxyFactoryBean、JdkDynamicAopProxy、CglibAopProxy | ||
门面模式(Facade) | 一扇门,门的后面是世界 | JdbcUtils、RequestFacade | ||
装饰器模式(Decorator) | 做蛋糕 | |||
享元模式(Flyweight) | ||||
组合模式(Composite) | 拥有主干,功能一致,生命周期一致,同综同源 | |||
适配器模式(Adapter) | 兼容 | |||
桥接模式(Bridege) | 只用组合和委托 |
设计模式 | 一句话归纳 | 目的 | 生活案例 | 框架源码举例 |
---|---|---|---|---|
委派模式(Delegate) | 这个需求很简单,如何实现我不管 | 只对结果负责 | 不属于23种设计模式 | ClassLoader |
模版模式(Template) | 流程固定,部分微调 | |||
策略模式(Strategy) | 选择权交给用户 | |||
责任链模式(Chain of Responsibility) | 踢皮球,对感兴趣地负责,省略if语句 | 踢皮球 | FilterChain | |
迭代器模式(Iterator) | 流水线上坐一天,每个包都过一遍 | 统一对集合地访问方式 | Iterator | |
命令模式(Command) | 解耦请求和处理 | 遥控器,FTP服务器 | Runnable | |
状态模式(State) | 状态驱动行为,行为决定状态 | 绑定状态和行为 | 订单状态跟踪 | Lifecycle |
备忘录(Memento) | 给我一杯后悔药 | 备份,支持撤回 | 草稿箱 | StateManagebleMessageContext |
中介者(Mediator) | 太君托我给你带个话 | 将网状资源整合,统一转发 | 朋友圈,群聊 | Timer |
解释器模式(Interpreter) | 自定义方言 | 实现特定地语法解析 | 摩斯密码 | Pattern。spring中的AOP表达式 |
观察者模式(Observer) | 你关注的人更新啦 | 解耦观察者和被观察者 | 关注更新提醒,闹钟 | ContextLoaderListener |
访问者模式(Visitor) | 专人看专有数据,且只读模式,不能操作 | 解耦数据结构和数据操作 | PKI考核 | FileVisitor,BeanDefinitionVisitor |
没有任何功能地增强就叫委派
命令:解耦请求和处理,会有一个回调,会反馈和处理方法
策略:固定好地选项,一定是同样地结果。
命令和策略都有自己地一个清单,对于命令而言,他是一个help 地列表,上面有所有可以操作的指令,当你执行地时候,会有一个回调或者说反馈,可能执行成功,也可能执行失败。而对应命令而言,请求和处理是可以写在一起地。只是为了解耦,所以在拆开来,写成了命令模式。
而策略是一定要用户来参与选择才可以地。
代理:组合实现功能地增强和扩展
装饰器:继承实现功能地增强和扩展
委派:没有流程地概念,只是拿到结果,并不在意过程,因为过程是其它类做地
责任链:拥有流程,处理流程可扩展,可定制,最终结果是根据一个节点或者多个节点决定。
代理:全程都要参与。跟进
中介者:只有开头没有结尾
工厂方法:产品地扩展,单向维度
抽象工厂:产品等级和产品簇相互扩展关系,多维度,至少二维
桥接:不用继承建立关系
适配器:类适配器用地继承,对象地适配器用地是组合,接口适配器实际上也是继承
创建型和行为型
抽象工厂形式上可能会出现抽象方法,但是并不能体现流程
模版方法:也是可能出现抽象方法,但是一定某个流程中一个步骤
建造者:强调对象创建步骤的个性化,一般来说会有标配
装饰器:更加强调扩展性,套娃
适配器:解决兼容问题,可以继承也可以组合
中介者:一定是用组合,所有人都可能持有中介者对象
共同点:不用继承,一定是用组合
桥接:两个维度建立连接。
中介者:对个维度建立连接(是一个更复杂的桥接模式实现)
桥接:两个继承体系建立连接
组合:目的不是建立连接,而是为了为一个整体统一行为,统一一套API
门面:统一入口,打开一扇窗,通向全世界。背后有很多子系统,有点代理的意思
装饰器:方便扩展
一般来说,他们会组合使用,策略有工厂建立。
我们可以把对象池的容器设置的单例
同时吧对象池所在的类设置成单例的工厂
桥接:需要一个中间的类,一定有功能实现
命令:需要一个抽象的中间类,只是为了规范
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。