您的位置:首页 > 其它

快速掌握23种设计模式(状态,策略,观察者)

2013-08-27 22:05 197 查看
       各种各样的设计模式都是把面向对象的思想运用到各种各样的场景下,并起一个恰当的名字而已。其实如果能够有很好的面向对象编程的思想,那么设计模式只需要看一眼定义就可以了。本文将以一种快速的,定义的,语义的阐述模式来解释23种设计模式。

状态模式:



显而易见,上面的类结构如此的简单。紧紧是运用了面向对象的多态思想。稍微有点基础的人都会写出这样的代码。但是还是把它抽象出来了一种设计模式,其中的道理或许值得我们好好琢磨一下。其实也不用好好的琢磨,说白了设计模式在很多情况下是基于语义的一种抽象而已。

好,那就仔细分析一下状态模式的语义吧。也就是说如果你写出了上面结构的代码还必须满足以下两点才能称之为状态模式:

1,  在状态模式中必须包含某一个对象的某种状态;

2,  对象状态的改变来触发不同的状态对应的方法,也就是上图中的State接口的几种实现。

 

总之,状态模式的定义为:一种状态的改变来相应的改变状态所对应的行为。比如在桌面应用中,界面上的各种操作从而导致界面各种状态的改变,而状态的改变从而导致行为的改变。如果一个对象的状态比较多,并且状态变化比较复杂,比如在图形界面的编程中,因为各种各样的操作都会引起图形界面状态的改变,因为就可以把界面的状态进行抽象,也就可以利用状态模式了。

策略模式:

说到策略模式,自然的会想到jdk中的comparable接口。是的,comparable是策略模式的一种典型的应用。

显而易见,策略模式更加的简单。下面以comparable接口为例,如下:

 

Comparable接口定义:

Public Interface Comparable {
int compareTo(Object o);
}
 

集合内的元素类实现上面的接口,就可以比较大小了。举例:

Public Student implements Comparable {
int age;
public int compareTo(Object o) {
(Student)o
}
}


说白了这也就是为了实现类型的强制转换(比如就可以在一个排序工具类类的内部强制把所以的对象转换成Comparable类型来实现排序),还是多态的应用。属于典型的父类引用指向子类对象。

 

策略模式二

上面的策略模式一对于集合内的元素会造成侵入性。那么我们是不是可以想一个更好的解决方案。比如说jdk当中的comparator接口。有策略模式一当中的接口定义可以看出接口中的compareTo方法只有一个参数,而该参数的类型也只可能是带比较对象的同一种类型。那么我们可以增加参数数量,直接上接口定义:

Public Interface Comparator {

int compare(Object o1,Object o2) ;

boolean equals(Object obj);

}


这样就可以在排序工具类中持有Comparator的方法来实现排序等功能,类似的调用过程如下:

Person[] listPerson = null;
java.util.Arrays.sort(listPerson, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return 1;
}
});


观察者模式

其实我总是感觉观察者模式这个名字起的很不恰当。我感觉叫做通知模式更为恰当。因为观察者模式为一种行为型的设计模式,因此名称应该体现于行为,那么这么说来我就是感觉“通知模式”比“观察者模式”更加的恰当。

 

下面来说定义:被观察的对象的状态或者是行为发生改变时,主动的通知到对此对象感兴趣的对象(观察者对象)。

根据上面的定义,显然我们就想到了,观察者模式的类结构:即被观察的对象持有一个或多个观察者的对象,当事件发生时去调用观察者对象身上的方法。具体实例嘛,就让我想到了图形界面中的Listenter和消息队列中的发布-订阅模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐