zoukankan      html  css  js  c++  java
  • 观察者模式

    观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
    观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
    下面是基础的逻辑代码,已经注释的很清楚了:就是一个用户操作的监听管理器,管理器监听用户行为,然后刷新想要刷新的依赖于它的对象。仔细看,代码很简单,理解很关键。
    package com.ggr.observer;
    
    import java.util.ArrayList;
    import java.util.List;
    /**
     * 事件监听管理规范
     * @author GG
     * 本来我是直接写一个管理器不想用接口的,但是老师说不同的业务场景通知的方式可能不一样,所以我将这个管理器抽象出来
     * 就是为了增加它的拓展性和灵活性,这也是面向对象真正的美丽之处吧。
     */
    public interface Manager{
        
        //管理的事件集合
        public List<Observer> list = new ArrayList<>();
        
        //事件添加规范
        public void addObserver(Observer o);
        
        //事件添加规范
        public void removeObserver(Observer o);
        
        //通知刷新规范
        public void notifyAllSubject();
    }
    package com.ggr.observer;
    
    /**
     * 
     * @author GG
     *自定义的事件管理器,它的刷新方式就是全部刷新
     */
    public class MyManager implements Manager {
    
        @Override
        public void addObserver(Observer e) {
            list.add(e);
        }
    
        @Override
        public void removeObserver(Observer e) {
            list.remove(e);
        }
    
        @Override
        public void notifyAllSubject() {
            for (Observer observer : list) {
                observer.click();
            }
        }
    
    }
    package com.ggr.observer;
    /**
     * 
     * @author GG
     *定义一个按钮实现点击规范
     */
    public class MyButton implements Observer{
    
        public String name;
        public MyButton(String name){
            this.name = name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
        
        @Override
        public void click() {
            System.out.println("按钮"+this.name+"事件触发");
        }
    
    }
    package com.ggr.observer;
    /**
     * 
     * @author GG
     * 定义一个图片按钮,实现了点击事件的规范
     *
     */
    public class MyImage implements Observer{
    
        MyImage(String name){
            this.name = name;
        }
        private String name;
        public void setName(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
        
        /**
         * 点击事件规范的实现
         */
        @Override
        public void click() {
            System.out.println("图片"+this.name+"事件触发");
        }
    
    }
    package com.ggr.observer;
    /**
     * 定义被观察者的规范,这里就是点击操作
     * @author GG
     *
     */
    public interface Observer {
        void click();
    }
    package com.ggr.observer;
    
    /**
     * 
     * @author GG
     * 测试
     *
     */
    public class TestDao {
        public static void main(String[] args) {    
            
            System.out.println("------------------------------------------");
                
            Observer btn= new MyButton("login");
            Observer image = new MyImage("my.png");
            
            Manager photo = new MyManager();
            photo.addObserver(btn);
            photo.addObserver(image);    
            
            photo.notifyAllSubject();
            
        }
    }
  • 相关阅读:
    Linux cron
    web报表工具FineReport常用函数的用法总结(文本函数)
    web报表工具FineReport常用函数的用法总结(文本函数)
    oracle instr函数
    死锁的例子和 synchronized 嵌套使用
    死锁的例子和 synchronized 嵌套使用
    Perl 监控批量错误
    Linux以百万兆字节显示内存大小
    Linux以GB显示内存大小
    Linux以KB显示内存大小
  • 原文地址:https://www.cnblogs.com/ggr0305/p/6591452.html
Copyright © 2011-2022 走看看