• 观察者模式


    观察者模式(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();
            
        }
    }
  • 相关阅读:
    delphi7 projectoptions打开出错
    file not found frmaddBdsuo.dcu
    session 不活动是因为未注册 WebSessionActivator,或试图在 IHttpHandler 的构造函数中 访问session
    oracle导出指定的表,并将指定的表追加到其他dmp文件中(不影响dmp中其他的表)
    父类指针转换成子类指针
    为什么会是这样的输出结果
    字符数组
    变量的声明和定义
    const对象默认为文件的局部变量
    输出结果
  • 原文地址:https://www.cnblogs.com/ggr0305/p/6591452.html
Copyright © 2020-2023  润新知