设计模式之*
今天来聊一聊剩下的常用的设计模式!
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