
设计模式
萝卜地里的兔子
爱吃胡萝卜的兔子
展开
-
命令模式--command模式
首先来一个命令的接口:package mode.command;/** * * 定义一个命令接口,其中有一个抽象的执行方法,参数人命令接收器 * * */public interface Command { public void execute(CommandReceiver commandReceiver);}定义一个命令接受者的接口:packa原创 2015-01-19 09:47:59 · 3760 阅读 · 0 评论 -
状态模式
状态模式,就是定义一个状态类,在这个状态类中有一个状态属性,来标明当前所处的状态;还有不同状态下要执行的方法。这些状态要暴露给外界,如外界通过不同的状态来执行不同的操作。就比如QQ的在线,忙碌,隐身等各种状态的实现。package mode.state;/** * * 定义状态类 * * */public class State { private String value原创 2015-03-10 13:36:21 · 3468 阅读 · 0 评论 -
中介者模式
中介者模式(Mediator Pattern):定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互。package mode.mediator;import java.util.Hashtable;public abstract class AbstractMediator { //定义一个哈希表来存放原创 2015-03-11 13:02:25 · 3346 阅读 · 0 评论 -
模版方法模式
在软件开发中有时候会遇到这样的情况,某个功能的实现需要多个步骤,这些步骤都是很明确的(第一步是什么,第二步是什么...比如做配菜:第一步是洗菜,第二步是切菜,第三步是装盘);其中某些步骤的做法是固定的(例如洗菜--用水泡洗干净、装盘--把菜摆放到盘子里),而有些步骤的做法就不确定(例如切菜--可以切丁、切块、切片。。。)。所以就有了模版方法模式,在模版方法模式中有一个抽象类,在该抽象类中有一个fi原创 2015-03-11 13:56:55 · 3616 阅读 · 0 评论 -
代理模式
package mode.proxy;/** * * 这里的代理模式是通过接口方式实现的 * * */public interface NetWork { public void browser();}package mode.proxy;public class Real implements NetWork { @Override public voi原创 2015-03-13 13:48:54 · 3577 阅读 · 0 评论 -
策略模式
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。—抽象策略角色: 策略类,通常由一个接口或者抽象类实现。—具体策略角色:包装了相关的算法和行为。—环境角色:持有一个策略类的引用,最终给客户端调用。package mode.strategy;/** * @ClassName: IStr原创 2015-03-13 13:39:43 · 3471 阅读 · 0 评论 -
观察者模式
观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。观察者设计模式定义了原创 2015-03-14 09:40:42 · 4401 阅读 · 0 评论 -
原型模式
原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件:实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedEx原创 2015-03-14 09:23:04 · 4036 阅读 · 0 评论 -
享元模式(Flyweight)
享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象,FlyWeight是超类。一提到共享池,我们很容易联想到Java里面的JDBC连接池,想想每个原创 2015-03-20 14:08:41 · 3944 阅读 · 0 评论 -
组合模式(Composite)
组合模式有时又叫部分-整体模式在处理类似树形结构的问题时比较方便,看看关系图public class TreeNode { private String name; private TreeNode parent; private Vector children = new Vector();原创 2015-03-20 14:02:42 · 4179 阅读 · 0 评论 -
外观模式(facade)
外观模式是为了解决类与类之间的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口,看下类图:(我们以一个计算机的启动过程为例)public class CPU { public void startup转载 2015-03-20 13:28:49 · 3816 阅读 · 0 评论 -
抽象工厂模式
抽象工厂模式是对工厂方法模式的改进:在工厂方法模式中,如果增加了新的产品那么就必须进入到工厂中去添加新的方法来产生新的产品,这样的方式对代码开发不是很友好。而抽象工厂模式就不同,在增加了新的产品以后,只需要再写一个相应的工厂即可。package mode.abstract_factory;/*抽象的水果工厂*/public interface AbstractFruitFactory {原创 2015-03-10 11:29:22 · 3823 阅读 · 0 评论 -
访问者模式
访问者模式适用于数据结构相对稳定但算法易于变化的系统。简单来说,访问者模式就是一种分离对象数据结构与行为的方法,通过这种分离,可达到为一个被访问者添加新的操作而无需做其他的修改效果。package mode.visitor;/**定义被访问对象的接口,这里在接口中定义了accept方法,用来接收不同的visitor实体,做不同的访问工作; * 同时在接口中定义了subject属性的get原创 2015-03-10 15:18:50 · 3475 阅读 · 0 评论 -
责任链模式
什么是责任链模式?自己理解--责任链模式就是由很多个程序块串联起来共同去完成莫一项任务(一个命令),每一个程序块都知道下一个是谁,并把命令传递给下一个程序块去执行。直到链的最后一环为止。定义一个程序块的标准:package mode.chain;import mode.command.Command;public abstract class Handler {原创 2015-01-20 11:03:08 · 3820 阅读 · 0 评论 -
静态方法工厂模式
工厂模式有三种方法来实现,一种是通过传入参数的名称来决定创建哪一个产品,这种方法有很大的缺点,就是如果传入的产品名称如果不小心错误的话,就是无法来创建我们想得到的产品的。另一种是方法工厂模式,这种工厂模式中对应每一个产品有一个创建方法,这样创建了工厂实例以后,直接通过工厂实例就可以调用相应的产品的创建方法来创建我们需要的产品。但是这种工厂模式需要创建工厂实例,一个工厂可能使用的地方有很多,一直创建原创 2015-03-04 08:59:25 · 3757 阅读 · 0 评论 -
单例模式
package mode.single;public class Single { private static Single single; private Single() { } public static Single getInstance() { if (null == single) { System.out.println("第一次创建"); sin原创 2015-03-03 11:36:01 · 3491 阅读 · 0 评论 -
创建者模式 builder
package mode.bulider;/** * * 首先是汽车,组成零件有:玻璃、轮胎、发动机;他们都是抽象的概念,所以用抽象类来创建 * * */public class Car { Glass glass; Wheel wheel; Engine engine;}package mode.bulider;/** * * 抽象的玻璃原创 2015-03-02 08:38:00 · 3961 阅读 · 1 评论 -
桥接模式(Bridge)
桥接模式,就是把向多个方向发展的变化由继承的实现变为了耦合的实现。package mode.bridge.test;/** * * 首先是一个抽象的咖啡类,有一个抽象的倒咖啡的方法 * * 在这个类中有一个咖啡伴侣的属性,为什么会有这个属性。因为我们在冲咖啡的时候可能加入不同种类的咖啡伴侣,也可能冲大杯的和小杯的咖啡。 * 这样我们的咖啡就有了两个方向的变化,大小和咖原创 2015-02-03 13:16:22 · 4073 阅读 · 0 评论 -
装饰器模式 decorator
所有的说明和解释都在代码中有注释来标明package mode.decorator;/** * * 这里定义一个接口,在接口中定义我们要执行的操作。 * * 以后所有的装饰器以及我们要装饰的对象都要实现这个接口。有了这样的大前提,我们就可以其用 Sourcable来定义我们的装饰器和要装饰的对象了 * * */public interface Sourcable原创 2015-01-30 14:25:15 · 3905 阅读 · 1 评论 -
备忘录模式
主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫备份模式更形象些,通俗的讲下:假设有原始类A,A中有各种属性,A可以决定需要备份的属性,备忘录类B是用来存储A的一些内部状态,类C呢,就是一个用来存储备忘录的,且只能存储,不能修改等操作。做个图来分析一下:Original类是原始类,里面有需要保存的属性value及创建一个备忘录类,用来保存value值。Meme转载 2015-03-26 17:16:16 · 3652 阅读 · 0 评论 -
迭代子模式(Iterator)
顾名思义,迭代器模式就是顺序访问聚集中的对象,一般来说,集合中非常常见,如果对集合类比较熟悉的话,理解本模式会十分轻松。这句话包含两层意思:一是需要遍历的对象,即聚集对象,二是迭代器对象,用于对聚集对象进行遍历访问。我们看下关系图: public interface Collection { public Iterator i转载 2015-03-23 14:26:39 · 4522 阅读 · 0 评论 -
解释器模式
解释器模式的类图如下: 定义了上下文对象,在对象中有两个数,我们要对这两个数进行对应的运算。我们在接口中定义了解释器,其中有一个解释的方法。在加法中我们实际的解释加的具体操作是什么。 [java] view plaincopypublic interface Expression { public int interpre原创 2015-03-26 17:08:22 · 3990 阅读 · 0 评论 -
适配器模式
1.类的适配器模式public class Source { public void method1() { System.out.println("this is original method!"); } }public interface Targetable {转载 2015-03-20 13:05:43 · 3752 阅读 · 0 评论 -
设计模式与重构汇总
面向对象的基本原则:单一原则:引起一个类发生变化的原因只有一个开放封闭原则:对于类的修改是封闭的,而对于类的扩展是开放的依赖倒置原则:高层不依赖于底层,都应该依赖与抽象;抽象不依赖于细节,细节依赖于抽象;里氏代换原则:子类可以代替父类出现;继承是父类、实现是接口;依赖是方法中的参数用到了别的类,关联是类中的属性有别的类而且自己不维护,组合要自己维护属性中其他原创 2017-05-31 10:38:49 · 1573 阅读 · 0 评论