设计模式
乐百川
这个作者很懒,什么都没留下…
展开
-
设计模式(三) 单例模式
单例模式也是一种创建型模式,而且也非常容易理解:在一个系统中可能需要多个配置文件,我们希望这些配置文件的实例只存在一个,而不是存在多个重复的实例。这时候就需要使用单例模式。单例模式有几个要点:一是必须确保只存在一个类的实例。二是类必须自己创建自己,不允许其他类来创建自己。三是必须提供一个方法允许其他类访问单例成员。根据这些特点,我们可以很容易猜出单例类在Java的样子:首先他的构造方法必须是原创 2017-03-17 23:02:06 · 345 阅读 · 0 评论 -
设计模式(十六) 解释器模式
解释器模式是一种行为型模式,它的主要作用是用一种方式来实现对表达式或文法的处理。我们可以使用解释器模式处理语言的解析,在设计计算机语言的时候解释器模式很有用处。解释器模式可能需要用到一点编译原理的知识。不过我自己编译原理的内容都忘光了,所以这里不做编译原理的任何介绍了。直接来看代码吧。我们来做一个不含括号的四则运算的解释器。解释器模式首先需要一个表达式接口,其中有一个方法用于解析表达式的值。publ原创 2017-03-30 00:23:01 · 307 阅读 · 0 评论 -
设计模式(十七) 迭代器模式
迭代器模式是现在使用非常广泛的一种模式,Java、C#等很多语言都是用迭代器创建集合,然后提供for-each语法糖让我们能够方便的遍历集合。如果对Java或C#等语言的集合比较熟悉的话,那么迭代器模式你也一定很熟悉。首先我们来编写迭代器的接口。该接口有两个方法,next()和hasNext(),用于判断是否存在下一个值并获取当前值。public interface Iterator { b原创 2017-03-30 00:47:41 · 338 阅读 · 0 评论 -
设计模式(十八) 中介者模式
当我们进行多人聊天的时候, 如果程序写成一对一的结构,那么当人数一多的时候程序就无法维护了。所以更好的做法就是抽象出一个聊天服务器,每个用户只和服务器进行通信。这样抽取出一个中介者的设计模式,就是中介者模式。如果系统中有大量对象需要互相通信,我们就可以思考该系统是否可以使用中介者模式进行重构。下面我们来写一个聊天室的小例子。首先需要一个聊天室,内部有一个List保存所有消息。聊天室还有一个方法用于显原创 2017-03-30 01:09:46 · 389 阅读 · 0 评论 -
设计模式(一) 工厂方法模式
介绍关于设计模式,大家可能已经有很多了解了。因此这里直接开始吧。首先来介绍一下工厂方法模式,它是一种创建型模式。在设计模式:可复用面向对象软件的基础中对工厂方法由如下的解释。 工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。”当然在实际情况中并不一定非要死板的定义一个工厂接口和多个工厂具体类。如果某个类对象创建复杂,我原创 2017-03-14 18:16:58 · 337 阅读 · 0 评论 -
设计模式(二) 抽象工厂模式
前面我们说了工厂方法模式,当只需要生产某一种类的时候可以使用。如果我们需要生产多类产品,就可以考虑使用抽象工厂模式。抽象工厂模式的使用情景如下:系统需要多种产品,但是每次只需要一组产品。产品种类较固定,产品的组合可能频繁变化。说得好像有点云里雾里,所以先看一个例子吧。首先我们先来定义两组产品接口,一个是调料,一个是食物。public interface Food { String ge原创 2017-03-15 23:17:42 · 243 阅读 · 0 评论 -
设计模式(十九) 备忘录模式
备忘录模式是一种行为型模式,作用是将对象的内部状态保存下来,在必要的时候恢复。备忘录模式可以用于游戏存档恢复、文件的历史记录等场合。下面是一个简单的代码例子。首先是文档管理器,用于保存文档的状态。public class DocumentManager { private Map<Integer, String> map = new HashMap<>(); public void原创 2017-04-05 21:54:56 · 705 阅读 · 0 评论 -
设计模式(二十) 观察者模式
观察者模式也是一种行为型模式,它的作用是将被观察者的任何状态变化传递给观察者。观察者模式在GUI编程的双向绑定等领域都有应用。只要我们希望实现一个类似消息订阅、接收的模式,就可以使用观察者模式。首先我们需要一个观察者接口,当被观察者发生变化的时候,需要通过该接口的方法通知观察者。public interface Observer<T> { void onChanged(T arg);}然后原创 2017-04-05 22:25:41 · 430 阅读 · 0 评论 -
设计模式(二十一) 状态模式
状态模式也是一种行为型模式,当我们的程序中需要一些状态转换,对于不同的状态需要不同的行为时,我们就可以考虑使用状态模式。下面用交通灯来当例子。我们需要红黄绿三种颜色的状态。interface State { void show();}class RedState implements State { @Override public void show() {原创 2017-04-05 23:52:20 · 441 阅读 · 0 评论 -
设计模式(二十二) 策略模式
有时候对象需要按照某种策略改变行为,我们可以利用策略模式,将策略或算法提取出来,作为单独的类实现。使用策略模式,可以让具体算法和应用对象分离,方便的根据不同条件替换策略。下面举一个例子。我们有一个计算器,它会按照快和慢两种策略来计算结果。所以我们可以将策略封装起来。public interface Strategy { double cal(double a, double b);}cla原创 2017-04-06 00:13:24 · 504 阅读 · 0 评论 -
设计模式(二十三) 模板模式
模板模式也是一种行为型模式,而且它非常好理解。当我们解决问题需要固定几个步骤, 这些步骤的顺序不能改变,而步骤的具体实现可以变化的时候,就可以使用模板模式。模板模式的要点就是定义一个具体方法,固定解决问题的步骤,而每个步骤声明成抽象方法,让具体子类来实现。下面用一个简单例子说明一下。我们吃饭需要买菜、做饭、吃饭、洗碗这几个步骤。所以可以定义下面这样一个抽象类。public abstract cla原创 2017-04-06 00:23:06 · 294 阅读 · 0 评论 -
设计模式(十五)命令模式
命令模式也是一种行为型模式,当我们的系统中需要处理各种命令(例如命令行)的时候,可以考虑使用命令模式,将命令封装为对象。这样和将命令直接硬编码到程序中相比,无疑是更好的。我们来做一个在线测评系统(OJ)的后端。我们需要检测一下当前后端有多少种可用的编译环境。检测方法很简单,就是使用各种编译环境的-version参数来查看一下版本,如果获取到版本号就说明当前编译环境是可用的。首先,我们新建一个接口,作原创 2017-03-29 20:21:07 · 373 阅读 · 0 评论 -
设计模式(十四)责任链模式
前面讨论了创建型模式、结构型模式,今天我们来讨论一下行为型模式。责任链模式,就是我们讨论的第一种行为型模式。责任链模式具体不容易说出来,但是如果看一看责任链模式的实际例子就很容易明白了。最典型的例子就是Java EE Servlet中的过滤器,以链式方式对请求进行过滤了。当我们遇到类似需求的时候,也可以使用责任链模式来解决。下面我们来模拟一下Java Servlet中的Filter。首先,需要请求和原创 2017-03-29 17:12:02 · 256 阅读 · 0 评论 -
设计模式(四) 建造者模式
建造者模式和工厂模式类似,也是一种创建型模式。它们的主要区别在于:工厂模式需要提供一些信息,而对象在最后一步才创建,而建造者模式则是一步一步的创建对象。一个非常典型的建造者的例子是Java中的StringBuilder,通过一步一步的添加字符串,最后构造不可变的String对象。当我们要创建的对象本身内部结构比较复杂,或者当配件的组合非常多的时候,就可以考虑使用建造者模式。直接看代码吧。首先我们需要原创 2017-03-20 21:07:13 · 271 阅读 · 0 评论 -
设计模式(五)原型模式
原型模式算是一种比较好理解的创建型模式了。当创建一个对象的开销比较大(比如需要从数据库或者网络中获取)时,我们可以考虑使用原型模式,创建一个对象的原型,以后获取对象的时候不在new,而是从原型中复制来获取。原型模式一般情况下不单独使用,而是和其他设计模式同时使用。Java等一些编程语言实现了类似Cloneable的接口,我们可以直接利用这些接口来实现原型。废话不多说,直接看代码吧。首先定义一个原型接原创 2017-03-20 21:58:16 · 247 阅读 · 0 评论 -
设计模式(六)适配器模式
前面介绍的几种设计模式都是创建型模式,用于以不同的方式创建对象。下面我们来看看适配器模式,这是一种结构型模式,用于在两个无关的接口之间搭建桥梁。适配器模式主要用于在新旧代码直接转换。直接看例子吧。假设我们有一个音乐播放器。public interface MusicPlayer { void playMusic();}class MyMusicPlayer implements Music原创 2017-03-20 22:45:46 · 308 阅读 · 0 评论 -
设计模式(七)桥接模式
参考资料:设计模式—–桥接模式(Bridge Pattern)。一开始我看的是菜鸟教程上的桥接模式,但是它讲的很垃圾,我看了半天没看明白,又查阅了这一篇,终于算是理解桥接模式了。桥接模式也是一种结构型模式,用来解决软件系统中多维度的变化。假如只有一个维度的变化,我们可以直接重写多个子类来解决。但是如果有两个维度同时变化呢?试想一下,汽车在道路上行驶,汽车有轿车、SUV之分,而道路又分为高速公路、市区原创 2017-03-20 23:29:34 · 292 阅读 · 0 评论 -
设计模式(八)过滤器模式
过滤器也是一种结构型模式,它允许我们使用不同的规则过滤某一组对象。首先我们来编写一个实体类,用作被过滤的对象。public class Person { private int age; private String name; private Gender gender; @Override public String toString() {原创 2017-03-21 00:04:29 · 1300 阅读 · 0 评论 -
设计模式(十二)享元模式
如果系统中可能存在大量相同的对象,那么我们可以建立缓存池之类的东西,将这些重复对象进行复用。这种设计模式就是享元模式。假设有一个游戏,里面需要汽车和摩托车两种载具。我们希望这些载具可以在游戏中复用,而不是每次都创建新对象。所以这个例子就可以使用享元模式来做。首先是汽车和摩托车的抽象。我们使用Visible接口表示这个对象将要在游戏中显示。public interface Visible {原创 2017-03-28 21:21:43 · 317 阅读 · 0 评论 -
设计模式(九)组合模式
在数据结构中,有树这么一种结构,转换到设计模式中就是组合模式。组合模式的作用就是以统一的方式处理一组具有树形结构的对象。最典型的例子就是菜单项了,一个菜单下可能包括多个菜单项,每个菜单项都可能包含其他子菜单。下面我们来实现菜单项。由于每个菜单项可能包含其他菜单项,所以我们需要一个列表来保存可能的菜单项。public class MenuItem { private List<MenuItem原创 2017-03-21 23:16:38 · 338 阅读 · 0 评论 -
设计模式(十)装饰器模式
装饰器模式是一种非常有用的结构型模式,它允许我们在不改变类的结果的情况下,为类添加新的功能。我们来举例说明一下。首先添加一组形状,它们都实现了形状接口。public interface Shape { String getShape();}class Square implements Shape{ @Override public String getShape() {原创 2017-03-21 23:48:38 · 379 阅读 · 0 评论 -
设计模式(十一)外观模式
外观模式是另一种结构型设计模式,当我们想要隐藏系统的复杂实现,想客户包含简单的使用接口的时候,就可以使用外观模式。我们需要创建一个外观类,提供要给用户暴露的方法。外观模式的优点就是用户和系统解耦,系统可以独立于用户修改,缺点就是用户虽然和系统解耦了,但是转而和外观类耦合。所以将来如果需要修改外观类将是一个麻烦的事情。我们用代码来说明一下外观模式吧。假设有这么一个生产流程:工厂生产产品需要一个请求,请原创 2017-03-22 02:04:22 · 509 阅读 · 2 评论 -
设计模式(十三)代理模式
代理模式也是一种结构性模式,它的主要作用是创建一个现有对象的代理,以便我们能够针对对象的生命周期、访问权限等进行控制。代理模式和适配器模式的区别是:适配器模式主要用于现有接口和新接口之间的转换和衔接,而代理模式对现有接口进行控制,所以代理模式不能改变对象的接口。假设我们有一个字符资源类,它实现了资源接口,并且能够随意设置字符串的值。public interface Resource { St原创 2017-03-28 23:19:52 · 272 阅读 · 0 评论 -
设计模式(二十四) 访问者模式
访问者模式提供了一种方法,将算法和数据结构分离。假设我们需要对一个数据结构进行不同的操作,就可以考虑使用访问者模式。访问者模式的要点在于,需要一个访问者接口,提供了一些重载方法来访问具体对象。对于每个具体对象,又提供了一个accept方法来回调访问者。首先来看看访问者。public interface Visitor { void visit(House house); void vi原创 2017-04-06 01:25:23 · 455 阅读 · 0 评论