本文属于设计模式系列拾遗,在某种情境下针对某种问题的某种解决方案即为设计模式
一 设计模式的几个原则
开闭原则(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
四 推荐