Java模拟AWT事件监听器(Observer模式)

Java模拟AWT事件监听器(Observer模式)

观察者模式定义了一种一对多的依赖关系,让多个观察者同时监听一个被观察者,当被观察者发生变化,所有的观察者就做出及时的响应。GUI中的按钮(Button)的事件监听模式就是一个Observer模式的实现,现在我们通过模拟这个事件来理解Observer.

    对于Button的图形界面的事件,我们就通过在测试类模拟,而不模拟图形实现。

   

复制代码
 1 interface Observerable {
 2     public void addActionListener(ActionListener a);
 3     public void pressed();
 4 }
 5 
 6 class Button implements Observerable{
 7     private List<ActionListener> l = new ArrayList<ActionListener>();
 8     
 9     public void addActionListener(ActionListener a) {
10         l.add(a);
11     }
12 
13     public void pressed() {
14         ActionEvent e = new ActionEvent(System.currentTimeMillis(), this);
15         for(int i=0; i<l.size(); i++) {
16             l.get(i).actionPerformed(e);
17         }
18     }
19     
20 }
21 
22 interface ActionListener {
23     void actionPerformed(ActionEvent e);
24 }
25 
26 class MyActionListener implements ActionListener {
27 
28     @Override
29     public void actionPerformed(ActionEvent e) {
30         System.out.println("MyActionListener");
31     }
32     
33 }
34 
35 class MyActionListener1 implements ActionListener {
36 
37     @Override
38     public void actionPerformed(ActionEvent e) {
39         System.out.println("MyActionListener1");
40     }
41     
42 }
43 
44 class ActionEvent {
45     private long when;
46     private Object o;
47     
48     public ActionEvent(long when, Object o) {
49         this.when = when;
50         this.o = o;
51     }
52     
53     public long getWhen() {
54         return when;
55     }
56     
57 }
58 public class Test {
59     
60     public static void main(String[] args) {
61         Observerable b = new Button();
62         b.addActionListener(new MyActionListener());
63         b.addActionListener(new MyActionListener1());
64         b.pressed();
65     }
66     
67 }
复制代码

    类结构图大致如下:

 当Button事件发生变化时,每个Listener作出不同的响应,Observer模式的一个用的非常广的架构就是MVC,举个例子,如果直接在JSP页面连接数据库做数据操作,当数据结构进行更改时,整个JSP页面或许都得改,但如果采用MVC,我们只需要更改Model,对应的View就会发生改变,可见Observer允许独立的改变目标和观察者,我们可以单独的复用目标对象或者观察者对象,降低目标对象与观察者对象的耦合度。

 
 

design pattern of java

 
摘要: 观察者模式定义了一种一对多的依赖关系,让多个观察者同时监听一个被观察者,当被观察者发生变化,所有的观察者就做出及时的响应。GUI中的按钮(Button)的事件监听模式就是一个Observer模式的实现,现在我们通过模拟这个事件来理解Observer. 对于Button的图形界面的事件,我们就通过在测试类模拟,而不模拟图形实现。 1 interface Observerable { 2 public void addActionListener(ActionListener a); 3 public void pressed(); 4 } 5 6 class Button i...阅读全文
posted @ 2013-04-20 22:12 名字起得长才有个性 阅读(298) | 评论 (2) 编辑

摘要: 前两篇阐述了FactoryMethod和AbstractFactory的实现以及类结构图,但是正如大家所知道的那样,没有任何事情是完美的,这两种设计模式也有自己的优缺点,而Spring对两种工厂模式取长补短,很好的解决了关于生产的产品维度以及产品系列维度问题。三、FactoryMethod与AbstractFactory对比 FactoryMethod与AbstractFactory对比: FactoryMethod主要是生产产品,为产品维度,缺点是生产产品系列时,易导致工厂泛滥。AbstractFactory主要是产品系列,为产品系列维度,缺点是生产产品品种时,工厂改动比较大,不灵活。四..阅读全文
posted @ 2013-04-14 23:13 名字起得长才有个性 阅读(78) | 评论 (0) 编辑

摘要: 上篇的FactoryMethod阐述的是生产不同的交通工具的工厂,要么让老张单独的开车去,要么让他单独的开飞机去,但是呢,这样老张不是很孤独寂寞去东北吗?一点娱乐的气息都木有,OK,现在我们酝酿一个这样的场景,让老张开着车,叼着苹果,扛着AK47去东北,这样老张就不无聊了,车、苹果、AK47,这是一个系列的产品,而AbstractFactory就是解决系列产品生产问题。二、AbstractFactory AbstractFactory模式 除了生产正常世界的系列产品,我们还可以生产魔法世界的系列产品(扫帚、魔法棒等),其实我们用的QQ或者酷我音乐盒等所用的皮肤更换功能,都是AbstractF.阅读全文
posted @ 2013-04-14 22:22 名字起得长才有个性 阅读(95) | 评论 (0) 编辑

摘要: “老张开车去东北 撞了 肇事司机耍流氓 跑了 多亏一个东北人 送到医院缝五针 好了 ……翠花,上酸菜” “老张开车去东北”,OK,这里如果我们刻意的用OO思想来看的话,老张这次是开车去的,下次就有很可能开飞机去的……这里请允许我刻意的这样的思考这个问题,因为刻意的这样思考,我们可以从这句话发现两个蕴含的设计模式,一个是FactoryMethod,一个是AbstractFactory。一、FactoryMethod FactoryMethod模式 OK,回到这句歌词,正如上面所说的,这次开车,下次开飞机……所以我们要思考出一种不管是车还是飞机或者火车,我们的程序都能灵活的适应需求的变化,这里就.阅读全文
posted @ 2013-04-14 22:09 名字起得长才有个性 阅读(492) | 评论 (0) 编辑

摘要: 之所以说是浅析单例模式是因为其实单例模式有很多种实现的写法,比如lazy initialization思想带来同步锁的实现方式纠结起细节来就可以写出很多种,这里我主要说一种实现的方式,也是最简单的—静态成员直接初始化的方式。 为什么会产生单例这个设计模式?主要是,如果我们在开发的过程中,每个实例都新建一个的话,会产生很多的内存开销,这对JVM不是什么好事,除此以外,如果很多实例,当这些实例不需要了,JVM去回收又是一件麻烦事,所以对于一些实例,如果确定可以共享,就不如一起共享一个,节省内存,提高性能。 1 /** 2 * 3 * @author LingJian 4 * 5 *...阅读全文
posted @ 2013-04-13 22:18 名字起得长才有个性 阅读(478) | 评论 (0) 编辑

摘要: Iterator模式提供一系列的方法用于遍历某一类聚合对象的各个元素,在此,通过模拟容器的迭代器来学习Iterator模式。 首先,模拟实现JAVA中用得最多的ArrayList和LinkedList,当然这2类容器都是实现Collection接口的,为什么要实现Collection接口?最根本的原因肯定是多态。 1 /** 2 * 3 * @author LingJian 4 * 5 */ 6 public class ArrayList implements Collection { 7 private Object[] objects = new Object[1...阅读全文
posted @ 2013-04-08 23:51 名字起得长才有个性 阅读(632) | 评论 (2) 编辑

摘要: 有了OO的基础后,开始认真学习设计模式。首先学习的是Strategy,下面就封装商场打折策略来分析下策略模式是怎样一回事。商场每逢节假日都会对不同的商品采用不同的打折策略,首先卖苹果的说我的苹果要打折,好的,我们建立Market和Apple类。 1 /** 2 * 3 * @author LingJian 4 * 5 */ 6 public class Market { 7 8 /** 9 * 只对Apple10 * @param apple11 */12 public static void normalSell(Apple appl...阅读全文
posted @ 2013-03-31 18:19 名字起得长才有个性 阅读(650) | 评论 (0) 编辑

摘要: 最近在自学设计,碰到一题目,我相信网上很多地方也能找到这个题目,题目内容如下:农场一头小母牛每年生头小母牛母牛五岁产母牛二十年上多少牛请使用OO思想来解决这个问题。这题目很有意思,为什么呢?因为读起来朗朗上口,很顺溜,哈哈,开个玩笑。OK,下面我将结合所学的知识和技巧来描述下自己解决这个问题的过程。名词 从题目内容中,我们可以抽取出多个名词,如农场、母牛等,为什么我们要把名词抽取出来?因为在OO思想中,就是要有类或者对象,而抽取出来的名词就有可能是我们需要的类或者对象,当然也有可能是类的属性,这个我们就需要结合具体的情况来分析。通过名词抽取,我确定我需要两个类,分别是农场和母牛,我命名为Fa.阅读全文
posted @ 2013-03-24 01:13 名字起得长才有个性 阅读(916) | 评论 (4) 编辑
原文地址:https://www.cnblogs.com/Leo_wl/p/3034726.html