设计模式读书笔记

本文属于设计模式系列拾遗,在某种情境下针对某种问题的某种解决方案即为设计模式

一 设计模式的几个原则

开闭原则(Open Close Principle):对扩展开放,对修改关闭

单一职责原则:就一个类而言,应该只有一个引起它变化的原因

里氏替换原则(Liskov Substitution Principle):所有引用基类的地方必须能透明地使用其子类的对象

依赖倒转原则(Dependence Inversion Principle):要针对接口编程,而不是针对实现编程,依赖抽象,不要依赖具体类.变量不可以持有具体类的引用.不要让类派生自具体类,不要覆基类累中已经实现的方法

接口隔离原则(Interface Segregation Principle):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口

迪米特法则(最少知道原则)(Demeter Principle)一个软件实体应当尽可能少地与其他实体发生相互作用.只和朋友交谈.在该对象方法内只调用该对象本身,被当做方法的参数传递进来的对象,此方法所创建或实例化的任何对象,对象的任何组件,减少依赖的类的数目

合成复用原则(Composite Reuse Principle):组合优于继承

好莱坞原则:别调用我们,我们会调用你,防止依赖腐败.将决策权放在高层组件,以便决定如何以及何时调用底层模块

其他原则:抽象/封装/多态/继承,封装变化的部分,高内聚低耦合

 

二 设计模式的分类

创建型模式,共五种:工厂方法(factory)模式、抽象工厂(abstract factory)模式、单例(singleton)模式、建造者(builder)模式、原型(prototype)模式。

结构型模式,共七种:适配器(adapter)模式、装饰器(decorator)模式、代理(proxy)模式、外观(facade)模式、桥接(bridge)模式、组合(composite)模式、享元(蝇量/flyweight)模式。

行为型模式,共十一种:策略(strategy)模式、模板(template)方法模式、观察者(observer/listener)模式、迭代器(iterator)模式、责任链(chain)模式、命令(message/command)模式、备忘录(memento)模式、状态(state)模式、访问者(visitor)模式、中介者(mediator)模式、解释器(expression/interpreter)模式。

?并发型模式和线程池模式

 

三 常用的一些设计模式

 

MVC模式

Model:业务逻辑,策略/观察者/被观察者,对应bean

View 前端展示 观察者/组合 对应jsp/html

Controller 控制器 观察者/策略 Servlet

 

创建型

涉及到对象创建和实例化解耦

工厂方法模式factory
所有工厂都是用来封装对象创建,把对象的创建委托给子类

工厂方法:定义了一个创建对象的接口,但由子类决定要实例化的是哪一个.工厂方法让类把实例化推迟到子类
抽象工厂模式:提供一个接口,用于创建相关或者以来对象的家族,而不需要明确指定具体类,允许客户使用抽象的接口来创建一组相关的产品,而不需要知道实际产出的产品是什么
pizaa.create(factory),AbstractFactory
生成器模式builder
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.生成器模式的主要功能是构建复杂的产品,而且是细化的,分步骤的构建产品.

Builder:生成器接口,定义各个部件操作。
ConcreteBuilder:具体实现/组装/提供产品对象
模版方法模式template

在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤,抽象方法?
hook钩子:是一种被声明在抽象类中的方法,但是只有空或者默认的实现,钩子的存在让子类有能力对算法的不同点进行挂钩,要不要挂钩,由子类自行决定
单例模式singleton

确保类只有一个实例,并提供全局访问点,一个静态变量,一个静态方法,私有构造器

 

行为型

如何交互和分配职责

命令模式command

命令模式将请求封装成对象,以便使用不同的请求/队列或者日志来参数化其他对象. execute,将请求和执行解耦
ps:空对象本身也是一种设计模式
策略模式strategy

定义算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变换独立与使用算法的客户
迭代器模式iterator

提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴漏其内部表示,把游走的责任放在迭代器上,责任各得其所
状态模式state

允许对象在内部对象状态改变是改变它的行为,对象看起来好像修改改了它的类:通过组合简单引用不通的状态造成类改变的假象,将行为委托给当前状态对象
状态对象:把状态的所有行为放在一个类中,将行为局部化使得事情容易改变和理解,代替放置许多if else条件判断
和策略模式的区别:相似但是意图不通,状态模式会随着时间改变改变状态,但是任何状态改变都是定义好的属于内部状态,但是策略模式是控制对象使用什么策略
观察者模式observer

在对象之间定义一对多的依赖,当一个对象更新时其他依赖他的对象都会受到通知,并自动更新,JAVA.Observer

 

结构型

组合到更大的结构中

组合模式composite

允许你将对象组合成树状结构来表现"整体/部分"的层次结构.组合能让客户以一致的方式处理个别对象以及对象组合,将相同的操作应用在组合和个别对象上,而忽略之间的差别
外观模式facade

提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用
和适配器以及装饰者的区别在于意图不同
代理模式proxy

为另一个对象提供提升或者占位符以控制对这个对象的访问 

远程代理/transient序列化/Rmi

虚拟代理:缓存代理

保护代理:动态代理 proxy/同步代理/外观代理/写入时复制
是否代理类isproxyclass newProxyInstance
适配器模式adapter

Adapter:和装饰者差不多,讲一个类的接口,转换成客户期望的另一个接口.适配器将原本不兼容的类可以合作无间
装饰模式decorator

动态的将责任附加到对象上,想要扩展功能,装饰者提供有别于继承的另一种选择.JAVA.IO.Stream

 

其他

桥接模式bridge

将实现B和抽象A放在两个不同的层次中而使他们可以独立改变,抽象A has a 抽象B ,将实现B解耦可以独立扩展,适合使用在需要跨越多个平台的系统上
蝇量模式/享元模式flyweight

运用共享技术有效地支持大量细粒度的对象.
相同部分独立出来-内蕴状态(单例模式共建共享)
不同部分独立出来-外蕴状态
比如文本压缩
责任链模式chain

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止
解释器模式interpreter

给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子.
Terminal Expression:终结符表达式
Nonterminal Expression:非终结符表达式

sql等解释
数学表达式解释expression4j
中介者模式mediator

集中管理对象之间的复杂的沟通和控制方式,将对象彼此解耦集中控制逻辑
备忘录模式memento

返回之前的状态,存储关键对象的重要状态,维护关键对象的封装,序列化
访问者模式visitor

将数据结构与数据操作分离,解决稳定的数据结构和易变的操作耦合问题

何时使用:需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,使用访问者模式将这些封装到类中。

如何解决:在被访问的类里面加一个对外提供接待访问者的接口。

关键代码:在数据基础类里面有一个方法接受访问者,将自身引用传入访问者
原型模式prototype

通过复制现有的实例来创建实例clone,当给定的实例创建非常复杂或者昂贵的时候使用.coneable

 

四 推荐

java开发中的23种设计模式

github源码

 

转载于:https://my.oschina.net/Bai1991/blog/1863080

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值