随笔分类 - 设计模式
摘要:引用一段经典的话,“武学的最高境界是无招胜有招”,在编程领域,设计模式就可以认为是招数,而真正的内功心法是设计原则; 下面讲述一下编程中应该遵循的基本原则 1、单一职责原则 一个类只负责一种职责,只有这种职责的改变会导致这个类的变更。绕口一点的正统说法:不要存在多于一个原因导致类变更 假如:类T 负
阅读全文
摘要:访问者模式是一种行为模式,一般用于封装操作的变化,即对于一组对象(或一个对象)数据结构相对固定,但操作方法上有很多变化,这时候可以使用此设计模式; 角色:抽象的访问者角色,定义访问者针对此组对象需要实现的方法约束; 具体访问者角色,实现抽象访问者的约束 抽象被访问者角色,主要定义需要接受访问者的约束
阅读全文
摘要:模板方法模式:定义完成一件事情的框架,将一些步骤延迟到子类中(实际上是交由子类去做),使得可以不改变算法结构即可重新定义某些步骤; 角色:抽象类(一个非抽象方法和若干抽象),具体类(继承于抽象类) 优点:使得系统结构组成有层次,有条理;减少代码量,减少不必要的重复代码(抽象类实现的代码不必在每个具体
阅读全文
摘要:策略模式的重点并不是策略的实现,而是策略的管理的使用! 应用场景:当同一种职责,有不同的实现方式的时候可以使用策略管理; 角色:1、策略抽象类 2、策略的具体实现 3、策略环境(此类的作用在代码中有详细说明) 策略模式是典型的依赖接口编程的实现! 策略模式的优点是将算法的责任和实现分割开来,便于系统
阅读全文
摘要:状态模式(状态对象模式):将状态和行为绑定起来,允许一个对象内部状态改变的时候,改变其行为! 本质上是将行为封装在状态中。 角色:1、状态行为的抽象 2、实际状态对象 3、状态环境(将状态作为成员变量) 下面看实际代码: 状态行为抽象 /* * Copyright (c) 2017. Xiaomi.
阅读全文
摘要:观察者模式,用于一对多关系对象之间消息传递。 观察者模式的实现需要以下几种角色: 1、观察者的抽象角色,一般就是一个接口,里面只有一个update方法,由观察者自己去实现当收到消息后的处理 2、观察者角色,实现观察者的抽象 3、主题的抽象角色,一般是一个抽象类 用于将观察者聚拢在一个集合里面,并提供
阅读全文
摘要:备忘录模式又称快照模式,是行为模式之一; 备忘录模式的应用场景是对某些对象做出了改变之后,又需要恢复到改变之前的状态!常常和命令模式结合使用... 备忘录中的三张角色; 1、原始角色,需要具有创建备忘录和根据备忘录恢复状态的方法 /* * Copyright (c) 2017. Xiaomi.Co.
阅读全文
摘要:中介者模式一般用于解决多个对象或者多个系统之间相互关联,交互的复杂关系的问题!这种关系一般是网状结构,使用中介者模式,将这种网状结构转换为星型结构,降低各个对象之间的耦合度。 网状结构一般会导致系统复杂,可扩展性差,对象可复用程度降低! 中介者模式的缺点是中介者类比较复杂,而且一旦出问题可能会影响整
阅读全文
摘要:命令模式:将命令封装成对象(下面示例中的Command对象),实现命令请求和命令执行者的解耦! 应用场景:1、出现一组命令的时候。2、需要实现undo操作的时候。3、命令请求与执行可能不是同步的是,需要实现异步处理;4、命令需要事务控制的时候 角色: receiver执行命令的具体对象,命令的实际执
阅读全文
摘要:责任链模式是一种行为模式,由许多可以处理同一件事情的对象,组成一个链状结构,每一个对象记录其下一个对象的引用,用于传递请求; 请求在这个链上传递,直到被处理或者是不能处理,返回!tomcat的servlet,Struts的filter都采用了责任链的设计模式。 以领导批复员工请假为例: 项目经理 部
阅读全文
摘要:享元模式一般是使某个类的一个实例,提供许多虚拟实例的一种实现!Java String类型就实现了享元模式! 享元模式是为数不多的为提升性能而设计的模式! 享元模式的享元对象中的数据区分了内部状态和外部状态 内部状态:在享元对象中,不随外界环境改变而改变的共享部分的数据; 外部状态:在享元对象中,随着
阅读全文
摘要:一般设计一个复杂的系统的时候,常常将整个系统按照功能划分为几个子系统;这样便于开发,也便于形成比较清晰的架构。 但对于使用者来说,如果需要了解各个系统的功能,则不是一件很简单的事情!这时候提供一个了解各个子系统功能的门面角色,用户只需要和门面角色交流即可! 例如:电脑开机这件事情,可能需要首先启动C
阅读全文
摘要:组合模式的一般定义:将对象组合成树形结构,表示整体!对于使用者来说,单个对象和整体是一致的。 组合模式一般在树形结构(层次结构)中应用较多,例如:菜单结构,文件夹结构;一般情况下是整体与单个对象具有很大的相似性; 使用组合模式实现菜单管理: 首先定义菜单的抽象类: /* * Copyright (c
阅读全文
摘要:代理模式应用场景一般是控制对象的访问权限,有时用于为对象增加功能。 与装饰模式的区别是,装饰模式增加的功能一般是特殊功能,而代理模式增加的功能是通用功能;同时,在实现上,一般代理模式中,被代理对象是在代理对象中创建的,而装饰模式中被装饰对象是通过构造函数从外部传入到装饰者中的。 装饰模式一般使用抽象
阅读全文
摘要:装饰模式:为对象增加额外的功能。 这么说来可能比较难以理解,举个例子:不同的工厂组装不同的手机,都需要安装CPU、主板、听筒、屏幕这几个部分! A厂除了安装上述部分外,还可能需要安装摄像头; B厂除了安装上述部分外,还可能需要安装距离传感器; 1、首先我们先建立一个组装手机的接口 /* * Copy
阅读全文
摘要:桥接模式属于结构型模式,主要用于某一个类,需要体现两个维度上的特征!例如一碗面条的味道可能需要蔬菜和肉的类型两个维度描述(海带鸡丝面,酸菜牛肉面等),并且每一个维度不能使用基本类型的变量描述,需要使用类描述。 桥接模式一般是由接口 + 抽象类 + 实现类描述的! 接口描述一个维度,抽象类描述另一个维
阅读全文
摘要:适配器模式一般是在系统改造,更新时,原有的接口与新的接口需求不匹配的情况下,使用适配器模式比较快速的解决此问题。 适配器模式的另一个优点是代码的复用,某些场景下,代码基本上可以复用,但需要稍作变动时,可以使用适配器模式来实现代码的复用。 一般来说,过多的使用适配器会使得系统比较杂乱,所以如果时间允许
阅读全文
摘要:原型模式的优点:简化对象的创建,使得创建对象就像复制粘贴一样easy。 使用原型模式创建对象,一般不会调用类的构造方法,Object的clone方法是一个本地方法,直接操作内存中的二进制流,在复制大对象时,性能差别非常明显。 关于深拷贝与浅拷贝 浅拷贝 - 拷贝的是值类型以及引用类型的地址 深拷贝
阅读全文
摘要:前面讲述了工厂模式,主要用于创建对象;建造者模式与工厂模式的相同之处在于都属于创建型的设计模式,即都是为解决方便创建对象而产生的设计模式! 不同之处在于,工厂模式一般用于创建产品本身较为简单,但是产品种类比较多,产品分类较复杂的场景;建造者模式一般用于创建产品本身比较复杂,但是不同产品的创建都需要遵
阅读全文