zoukankan      html  css  js  c++  java
  • 设计模式之*

    今天来聊一聊剩下的常用的设计模式!

    1.观察者模式

    假如有一个小孩,我需要在他睡醒之后,给他喝奶。我们大概可以这样做,设一个标志位=false,当小孩醒的时候,标志=true;

    写一个Dad类,定义一个方法,写一个空循环,直到flag=true,跳出循环,执行下面的操作,喂奶,这样做,我们需要两个线程,让Dad的方法

    在主线程里面跑,为小孩类,再开一个线程。

    确实,上面的方法没有问题,也万全可以这样做,但是主线程必须不断地去检测标志位的值,不断地去校验,想想这样子也不是很科学,十分地浪费资源。

    这样,我们来换一个思路,现在不让Dad实时地去监测小孩类,我们在小孩睡醒后,给Dad类,发一个通知,告诉Dad,我醒了,让Dad给小孩喝奶,

    具体的代码实现,大概是这样写的;小孩类中,实例化一个Dad类对象dad,在小孩的wake()方法中,去调用dad的nurse()方法进行喂奶。

    这样做,可以节省线程上的资源,实现起来也相对简单。

    JDK中awt,我自己是用得很少,可以几乎说是陌生,当时awt中有类似的实现。有一个Button类,里面有一个List,装着一群ActionListener,当触发Button的press方法的时候,遍历List,传给ActionListener一个ActionEvent对象,让这些ActionListener对这个ActionEvent对象逐一地做出响应。这就是观察者模式,让主题或者通知者去传递事件,去通知观察者,观察者做出响应!

    2.brige(桥接)模式

    在两个维度进行排列组合的时候,你可以使用桥接模式,采用内聚的方式实现。用聚合去代替继承!

    在看马老师的视频的时候,他举了这样的一个例子,关于送礼物的问题。

    礼物有很多种类,当从不同方向维度去分类的时候,会出现交叉的情况。

    比如说 浪漫的,惊喜的,另类的(这可以说是一个维度)

    按实物去划分,可以是 花,戒指。

    现在问题来了,怎么送浪漫的花,或者说另类的戒指的,

    如果你简单地写了一个Gift类,然后写5个继承,浪漫,惊喜,另类,花,戒指。然后你想去送另类的戒指,这个时候就非常地难办。

    存在多个维度的时候,这个简单的单继承是很难去解决问题的,你可以这样写,

    在写一个GiftImpl类,让花,戒指去继承它,

    让浪漫,惊喜,另类去继承Gift类,

    然后呢在Girf类中定义一个GiftImpl的引用,在子类的构造方法中传入一个实现GirtImpl的子类。

    在送礼物的时候,你就可以new Offbeat(new Ring());这就是一个另类的戒指,好的,你可以拿去送人了.

    3.Adapter(适配器)模式

    举个最简单的例子,用过手机的都知道,你除了数据线,还需要一个适配器的头,为什么?

    中国的电压是220v,你让他直接输到你的手机里?怎么可能?手机是受不了这么大的电压的,所有需要一个转换头,将输出电压适配到你手机所能接受的电压。

    如果你要从java中去看待这个问题,我大概能说出两个方面,

    JDBC-ODBC,说的是你用java去操控微软的数据库(access),就是你写java代码 通过适配器转成obdc的代码,间接地去操控access.

    还有一个就是java.io中的类 InputStreamReader()就是将InputStream转化成Reader

    4.Command(命令)模式

    个人觉得没什么好讲的,就是封装命令,让命令的发送者,调用命令的执行者去执行命令。

    5.state模式

    状态决定执行,语法上的实现和策略模式差不多!学到这里,23中设计模式的区分,更多的是语义,语法上的实现可能差不多!

    6.mediator模式

    调停者

    7.facade

    action去调用service层,service可以说是一个facade

  • 相关阅读:
    CSS知识点:清除浮动
    CSS3的应用,你学会了吗?
    必须掌握的JavaScript基本知识
    一个搜索框的背后
    mybatis 中 foreach collection的三种用法
    基于Pipe的PureMVC FLEX框架的多核共享消息技术
    Flex与Java通信之HttpService
    python + eclipse + django + postgresql 开发网站(二)
    python + eclipse + django + postgresql 开发网站(一)
    [转]Python集合(set)类型的操作
  • 原文地址:https://www.cnblogs.com/think-in-java/p/4771076.html
Copyright © 2011-2022 走看看