2_《读_Head_First_有感》_“观察者模式”

3 篇文章 0 订阅
2 篇文章 0 订阅

前言:
前沿技术一直在迭代,有一种东西是不会更新的,那就是设计模式的思想。 可以来学习学习设计模式的思维,巧妙设计!

1.官方话语概述六大原则:个人话语概述六大原则今日主题场景:概述:代码如下'主题'代码'观察者'代码'数据展示和test'代码读者须知:进度

1.官方话语

概述

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。

六大原则:

单一职责原则 (Single ResponsiBility Principle) 概括:应该有且仅有一个原因引起类的变更
里氏替换原则(liskov Substitution Principle ) 概括:基类出现的地方,子类一定可以出现
依赖倒转原则(Depndece Inversion Principle) 概括:针对接口编程,依赖于抽象而不是具体
接口隔离原则(Interface Segregation Principle) 概括:使用多个隔离的接口,比使用单个接口好 (细分接口,降低耦合)
迪米特法则 (Demeter Principle) 概括:实体应当尽量少的与其他类发生互相作用,使得系统功能模块相对独立
开闭原则(Open Close Principle) 概括: 对扩展开放,对修改关闭
合成复用原则 (Composite Reuse Principle) 概括:尽量使用合成/聚合的方式,少用继承

个人话语

概述

设计模式在代码层级中,是让你在某种业务场景刚开始设计时,能让未来的相关需求扩展极为方便的一个思想。
简单的说,在一开始设计好,扩展是很方便的,设计模式就是这个功劳者
对于我们本来就懒的开发人员来说,这是求之不得的。

六大原则

而对于六大原则,简单过一下就行,不用刻意理解,如果你会了面向对象和设计模式的使用,自然就遵循了。

今日主题

观察者模式: 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新

场景:

比如现在我管理多个相同仓库,我要更新它的长宽高(假设他们的长宽高都一致),并通知到这多个仓库。

概述:

简单的说就是你更新了数据,要通知所有相关的人员。
这样的情况,我们可以采用观察者模式,有着多对1的关系,像维护数据库表那样维护,维护1比维护多要简单,便捷。
而在该模式中,好比一个主题(具备 观察者的 注册,更新,同步等)以及多个观察者,主题具体主动权去操作每个观察者。

代码如下

'主题'代码

  1package top.huey.designpattern.observerpattern.subject;
  2
  3import top.huey.designpattern.observerpattern.observer.Observer;
  4
  5/**
  6 * @author huey
  7 * @Description : 主题对象,管理观察者,出现任何更改,通知所有观察者,、
  8 * 1主题,n观察者
  9 * @Date Created in 2018/7/10 13:56
 10 */
 11public interface Subject {
 12
 13    /**
 14     * 注册指定观察者
 15     */
 16    void registerObserver(Observer observer);
 17
 18    /**
 19     * 删除指定观察者
 20     */
 21    void removeObserver(Observer observer);
 22
 23    /**
 24     * 同步更新观察者
 25     * 调用所有观察者的某个数据更新
 26     * (如何通知先不管,暂时只是update)
 27     */
 28    void notifyObserver();
 29}
 30
 31
 32
 33/**
 34 * @author huey
 35 * @Description : 具体的主题对象
 36 * @Date Created in 2018/7/11 11:50
 37 */
 38public class ConcreteSubject implements Subject {
 39
 40    /**
 41     * 具体主题,依赖所有观察者,同步各种数据
 42     */
 43    private List<Observer> observers;
 44
 45    /**
 46     * 观察者 长属性
 47     */
 48    private int length;
 49
 50    /**
 51     * 观察者 宽属性
 52     */
 53    private int weight;
 54
 55    /**
 56     * 观察者 高属性
 57     */
 58    private int high;
 59
 60    /**
 61     * 对象初始化,初始化观察者集合对象
 62     */
 63    public ConcreteSubject() {
 64        observers = new ArrayList<>();
 65    }
 66
 67    /**
 68     * 模拟注册指定观察者
 69     *
 70     * @param observer
 71     */
 72    @Override
 73    public void registerObserver(Observer observer) {
 74        observers.add(observer);
 75    }
 76
 77    /**
 78     * 模拟删除指定观察者
 79     *
 80     * @param observer
 81     */
 82    @Override
 83    public void removeObserver(Observer observer) {
 84//        observers.remove(observer);
 85        int i = observers.indexOf(observer);
 86        if (!StringUtils.isEmpty(i)) {
 87            observers.remove(i);
 88        }
 89    }
 90
 91    /**
 92     * 同步更新观察者
 93     * 调用所有观察者的某个数据更新
 94     * (如何通知先不管,暂时只是update)
 95     */
 96    @Override
 97    public void notifyObserver() {
 98        for (Observer observer : observers) {
 99            observer.update(this.length,this.weight,this.high);
100        }
101    }
102
103
104    /**
105     * 对外设置All,同步
106     */
107    public void setValue(int length, int weight, int high) {
108        this.length = length;
109        this.weight = weight;
110        this.high = high;
111        notifyObserver();
112    }
113}

'观察者'代码

总结:perfect!如果你需要扩展多个观察者,只需要写出Observer的实现,然后在相应的实例化子类被主题注册即可。

  1package top.huey.designpattern.observerpattern.observer;
  2
  3/**
  4 * @author huey
  5 * @Description : 观察者接口 具备实际更新行为
  6 * @Date Created in 2018/7/11 11:29
  7 */
  8public interface Observer {
  9
 10    /**
 11     * 当前观察者更新数据
 12     * 参数为你要更新的参数
 13     */
 14    void update(int ... length);
 15
 16}
 17
 18
 19
 20/**
 21 * @author huey
 22 * @Description : 根据需求更新哪些数据,此处更新length
 23 * @Date Created in 2018/7/16 11:32
 24 */
 25public class Concrete2Display implements DisplayElement, Observer {
 26
 27    private int length;
 28
 29    private int weight;
 30
 31    private int high;
 32
 33    private Subject concreteSubject;
 34
 35
 36    /**
 37     * @param
 38     * @return
 39     * @description 注册
 40     * @author: xiaoying@hexindai.com V1.0 2018/7/16 13:02
 41     */
 42    public Concrete2Display(Subject concreteSubject) {
 43        this.concreteSubject = concreteSubject;
 44        concreteSubject.registerObserver(this);
 45    }
 46
 47    /**
 48     * 模拟更新
 49     *
 50     * @param
 51     */
 52    @Override
 53    public void update(int... arrs) {
 54        this.length = arrs[0];
 55        this.weight = arrs[1];
 56        this.high = arrs[2];
 57        this.display();
 58    }
 59
 60    /**
 61     * 展示数据
 62     */
 63    @Override
 64    public void display() {
 65        System.out.println(this.getClass().toString() + "----length: " + this.length + ",weight: " + this.weight + ",high: " + this.high);
 66    }
 67}
 68
 69
 70
 71
 72/**
 73 * @author huey
 74 * @Description : 根据需求更新哪些数据,此处更新length
 75 * @Date Created in 2018/7/16 11:32
 76 */
 77public class ConcreteDisplay implements DisplayElement, Observer {
 78
 79    private int length;
 80
 81    private int weight;
 82
 83    private int high;
 84
 85    private Subject concreteSubject;
 86
 87
 88    /**
 89     * @param
 90     * @return
 91     * @description 注册
 92     * @author: xiaoying@hexindai.com V1.0 2018/7/16 13:02
 93     */
 94    public ConcreteDisplay(Subject concreteSubject) {
 95        this.concreteSubject = concreteSubject;
 96        concreteSubject.registerObserver(this);
 97    }
 98
 99    /**
100     * 当前观察者更新数据
101     * 参数为你要更新的参数
102     *
103     * @param length
104     */
105    @Override
106    public void update(int... length) {
107        this.length = length[0];
108        this.display();
109    }
110
111    /**
112     * 展示数据
113     */
114    @Override
115    public void display() {
116        System.out.println(this.getClass().toString() + "----length: " + this.length + ",weight: " + this.weight + ",high: " + this.high);
117    }
118}

'数据展示和test'代码

 1package top.huey.designpattern.observerpattern.display;
 2
 3/**
 4 * @author huey
 5 * @Description : 数据展示
 6 * @Date Created in 2018/7/11 11:48
 7 */
 8public interface DisplayElement {
 9
10    void display();
11}
12
13/**
14 * @author huey
15 * @Description : 测试代码
16 * @Date Created in 2018/7/16 10:43
17 */
18public class TestObserver {
19
20    /**
21     * @author huey
22     * @Description : 多对1,实时通知
23     * @Date Created in 2018/7/16 14:06
24     */
25    @Test
26    public void test1() {
27        /**
28         *创建主题
29         */
30        ConcreteSubject concreteSubject = new ConcreteSubject();
31        /**
32         *注册当前观察者concreteDisplay到主题
33         */
34        ConcreteDisplay concreteDisplay = new ConcreteDisplay(concreteSubject);
35
36        /**
37         *更新,通知多个观察者,展示
38         */
39        System.out.println("-------begin--------");
40        concreteSubject.setValue(32, 1, 1);
41
42        /**
43         *注册第二个观察者到主题
44         */
45        new Concrete2Display(concreteSubject);
46        /**
47         *更新,通知多个观察者,展示
48         */
49        System.out.println("-------more--------");
50        concreteSubject.setValue(32, 2, 1);
51
52        /**
53         *删除第一个观察者到主题
54         */
55        concreteSubject.removeObserver(concreteDisplay);
56
57        System.out.println("-------less--------");
58        concreteSubject.setValue(32, 1, 0);
59    }
60
61}

读者须知:

1.本系列文章内容会比较简陋,望有兴趣读者还是fork源码,调试一下。(如果你看过该书,一定可以加深印象)
2.联想下实际运用的哪些业务场景用到该模式,哪些中间件用到该模式,是否自己能在业务中使用。
3.即使你现在用不到某些设计模式,但是还是应该理解其原理的。
4.当时理解并不意味着自己已会,可以自己尝试练习,并幻想一种业务场景,画画类图,设计一下。


coding 时,做到了如何落实;
writing时,做到了如何表达;
sharing时,做到了如何传授;
thinking时,做到了如何提升;

代码请参考码云:https://gitee.com/tjhuey/CodingGroup
设计模式相关概念请参考:http://naotu.baidu.com/file/5811bf42020e6a2d877b992cfca90d26

进度

策略模式,已完成

观察者模式,已完成;

x..,未完成;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值