
设计模式之禅
with_dream
这个作者很懒,什么都没留下…
展开
-
uml类图基础
1、继承继承是类与类、接口与接口之间 2、实现3、组合关联关系的一种,是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。 如果persion由brain组成,表现为persion包含有brain的全局对象,并且brain对象在persion创建的时刻创建。 4、聚合关联关系的一种,是强的关联关系。聚合关系是整体和个体的关系。 如果family由child原创 2017-08-20 10:12:07 · 196 阅读 · 0 评论 -
适配器模式
定义:将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作Target 目标角色:期望的类/接口 Adaptee 源角色:无法匹配的类/接口 需要被转换 Adapter适配器:把源角色转换为目标角色interface Target{ void request(); }class ConcreteTarget implements Ta原创 2017-08-22 22:33:57 · 188 阅读 · 0 评论 -
迭代器模式
定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。抽象容器:一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。 具体容器:就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。 抽象迭代器:定义遍历原创 2017-08-22 23:16:53 · 197 阅读 · 0 评论 -
组合模式
定义:将对象组合成树形结构以表示“部分-整体”的层次结构,是的用户对单个对象和整体对象的使用具有一致性componsent抽象构建角色:定义共有的方法和属性 Leaf叶子对象:其下没有分支,是最小的遍历结构 Composite树枝对象:组合树枝节点和叶子节点形成一个树形结构abstract class Component{ public void doSomeThing() {/原创 2017-08-23 00:04:12 · 166 阅读 · 0 评论 -
观察者模式
定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更被观察者:从类图中可以看到,类中有一个用来存放观察者对象的Vector容器(之所以使用Vector而不使用List,是因为多线程操作时,Vector在是安全的,而List则是不安全的),这个Vector容器是被观察者类的核心,另外还有三个方法:attach方法是向这个容器中添加观察者对象;deta原创 2017-08-23 00:21:01 · 186 阅读 · 0 评论 -
门面模式
定义:要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。Facade门面角色:知道所有子系统的功能和责任。客户所有的请求都是通过门面角色委派到子系统处理,而自身没有没有业务逻辑 subsystem子系统:可以有一个或多个子系统。每一个子系统是一个完整的功能模块,子系统不知道门面角色的存在,门面仅仅是一个客户端而已 门面将复杂的子系统原创 2017-08-23 01:14:26 · 193 阅读 · 0 评论 -
备忘录模式
定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态发起人:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。 备忘录:负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。 管理角色:对备忘录进行管理,保存和提供备忘录。class Originator { //记录当前时刻原创 2017-08-23 01:36:22 · 202 阅读 · 0 评论 -
访问者模式
定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。抽象访问者:抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是visit方法中的参数定义哪些对象是可以被访问的。 访问者:实现抽象访问者所声明的方法,它影响到访问者访问到一个类后该干什么,要做什么事情。 抽象元素类:接口或者抽象类,声明接受哪一类访问者访问,程序上是通过accep原创 2017-08-23 10:32:04 · 275 阅读 · 0 评论 -
状态模式
定义:当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类State抽象状态角色:接口或抽象类,负责对象状态的定义,并且封装环境角色以实现状态切换。 ConcreteState具体状态角色:需要完成两个职责,在本状态下要做的事以及如何过渡到其他状态 Context环境角色:定义客户端需要的接口,并且负责具体状态的切换abstract class State{ protect原创 2017-08-23 11:25:19 · 180 阅读 · 0 评论 -
解释器模式
定义:给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子。抽象解释器:声明一个所有具体表达式都要实现的抽象接口(或者抽象类),接口中主要是一个interpret()方法,称为解释操作。具体解释任务由它的各个实现类来完成,具体的解释器分别由终结符解释器TerminalExpression和非终结符解释器NonterminalExpression完成。 终结符表原创 2017-08-23 11:41:53 · 245 阅读 · 0 评论 -
享元模式
定义:使用共享对象可以有效的支持大量的细粒度的对象FlyWeight抽象享元类:通常是一个接口或抽象类,声明公共方法,这些方法可以向外界提供对象的内部状态,设置外部状态。 UnsharedConcreteFlyWeight非共享享元类:不能被共享的子类可以设计为非共享享元类。 ConcreteFlyWeight具体享元类:为内部状态提供成员变量进行存储。 FlyWeightFactory享元工原创 2017-08-23 15:13:26 · 182 阅读 · 0 评论 -
策略模式
定义:一组算法,将每个算法都封装起来,并且使他们之间可以互换。封装类:也叫上下文,对策略进行二次封装,目的是避免高层模块对策略的直接调用。抽象策略:通常情况下为一个接口,当各个实现类中存在着重复的逻辑时,则使用抽象类来封装这部分公共的代码,此时,策略模式看上去更像是模版方法模式。具体策略:具体策略角色通常由一组封装了算法的类来担任,这些类之间可以根据需要自由替换。interface IStrateg原创 2017-08-22 21:58:19 · 160 阅读 · 0 评论 -
装饰者模式
定义:动态的给一个对象添加一个额外的职责。比子类更加灵活抽象组件AbstractComponent:定义一个抽象接口,来规范准备附加功能的类 具体组件Component:将要被附加功能的类,实现抽象构件角色接口 抽象装饰者AbstractDecorator:持有对具体构件角色的引用并定义与抽象构件角色一致的接口 具体装饰Decorator:实现抽象装饰者角色,负责对具体构件添加额外功能。abs原创 2017-08-22 20:05:35 · 214 阅读 · 0 评论 -
设计模式的基本原则
1、单一职责模式一个类只做一件事,一个方法只做一件事优点: 类的复杂度降低,职责清晰明确 提高可读性高,可维护性 变更引起的风险降低。缺点: 类膨胀,增加系统的复杂度2、里氏替换原则父类出现的地方,子类也可以,且替换为子类不会出现错误或异常优点: 提高代码的可重用性 提高代码的可扩展性缺点: 降低代码灵活性 增加耦合度3、依赖倒置依赖接口编程,而不是依赖具体类编程。即面向接口编程优点原创 2017-08-20 20:50:34 · 163 阅读 · 0 评论 -
模式总结
1、各模式的区别创建类模式: 单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式结构类模式: 适配器模式、桥接模式、组合模式、装饰者模式、门面模式、享元模式、代理模式。行为类模式: 观察者模式、策略模式、模板方法模式、状态模式、访问者模式、备忘录模式、中介者模式、迭代器模式、解释器模式、命令模式、责任链模式代理模式与装饰者模式装饰者模式是代理模式的一种特殊应用。 两者有共同的接口,但是原创 2017-08-24 19:25:33 · 224 阅读 · 0 评论 -
建造者模式
1、基本概念定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 四个要素 产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的原创 2017-08-20 21:47:37 · 165 阅读 · 0 评论 -
工厂模式
1、基本概念定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。工厂模式:工厂模式根据抽象程度的不同分为三种:简单工厂模式(也叫静态工厂模式)、工厂方法模式、以及抽象工厂模式。工厂模式是编程中经常用到的一种模式。它的主要优点有:可以使代码结构清晰,有效地封装变化。在编程中,产品类的实例化有时候是比较复杂和多变的,通过工厂模式,将产品的实例化封装起来,使得原创 2017-08-21 23:44:22 · 189 阅读 · 0 评论 -
模板模式
1、基本概念定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。模版方法模式的结构模版方法模式由一个抽象类和一个(或一组)实现类通过继承结构组成,抽象类中的方法分为三种: 抽象方法:父类中只声明但不加以实现,而是定义好规范,然后由它的子类去实现。 模版方法:由抽象类声明并加以实现。一般来说,模版方法调用抽象方法来完成主要的逻辑原创 2017-08-22 00:04:49 · 199 阅读 · 0 评论 -
代理模式
1、基本概念定义:为其他对象提供一种代理,以控制对这个对象的访问 对外开放Proxy类,但是具体的逻辑由RealSubject实现。public interface Subject{ void request(); }public class RealRequest implements Subject{ @Override public void request() {原创 2017-08-22 11:46:46 · 181 阅读 · 0 评论 -
原型模式
1、基本概念定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。//实现Cloneable class Prototype implements Cloneable { public Prototype clone(){ Prototype prototype = null; try{ prototype = (Prot原创 2017-08-22 12:03:46 · 199 阅读 · 0 评论 -
中介者模式
1、基本概念定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。抽象中介者:定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信。一般包括一个或几个抽象的事件方法,并由子类去实现。中介者实现类:从抽象中介者继承而来,实现抽象中介者中定义的事件方法。从一个同事类接收消息,然后通过消息影响其他同时类。同事类:如果一个对原创 2017-08-22 14:53:01 · 163 阅读 · 0 评论 -
命令模式
1、基本概念定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。Command类:是一个抽象类,类中对需要执行的命令进行声明,一般来说要对外公布一个execute方法用来执行命令。 ConcreteCommand类:Command类的实现类,对抽象类中声明的方法进行实现。 Client类:最终的客户端调用类。 Invo原创 2017-08-22 15:27:36 · 230 阅读 · 0 评论 -
责任链模式
1、基本概念定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。抽象处理类:抽象处理类中主要包含一个指向下一处理类的成员变量nextHandler和一个处理请求的方法handRequest,handRequest方法的主要主要思想是,如果满足处理的条件,则有本处理类来进行处理,否则由nextHandler原创 2017-08-22 17:06:39 · 154 阅读 · 0 评论 -
桥接模式
定义: 将抽象和实现解耦,使得两者可以独立变化抽象化(Abstraction)角色:它的主要职责是定义出该角色的行为,同时保存一个对实例化角色的引用,该角色一般是抽象类 修正抽象化(RefinedAbstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。 实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化原创 2017-08-23 15:54:10 · 250 阅读 · 0 评论