Java设计模式(1):观察者模式

2023-11-18

面向对象思想设计原则

在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设计原则。

在这里插入图片描述

1. 单一职责原则

其实就是开发人员经常说的”高内聚,低耦合”。

也就是说,每个类应该只有一个职责,对外只能提供一种功能,而引起类变化的原因应该只有一个。

在设计模式中,所有的设计模式都遵循这一原则。

例如:要实现逻辑和界面的分离。

简单通俗的来说:一个类只负责一项职责。

2. 开闭原则

核心思想是:一个对象对扩展开放,对修改关闭。

其实开闭原则的意思就是:对类的改动是通过增加代码进行的,而不是修改现有代码。

也就是说软件开发人员一旦写出了可以运行的代码,就不应该去改动它,而是要保证它能一直运行下去,如何能够做到这一点呢?这就需要借助于抽象和多态,即把可能变化的内容抽象出来,从而使抽象的部分是相对稳定的,而具体的实现则是可以改变和扩展的。

3. 里氏替换原则

核心思想:在任何父类出现的地方都可以用它的子类来替代。

其实就是说:同一个继承体系中的对象应该有共同的行为特征。

通俗简单的说就是:子类可以扩展父类的功能,但不能改变父类原有的功能。

4. 依赖注入(依赖倒置原则 )原则

核心思想:要依赖于抽象,不要依赖于具体实现。

其实就是说:在应用程序中,所有的类如果使用或依赖于其他的类,则应该依赖这些其他类的抽象类,而不是这些其他类的具体类。为了实现这一原则,就要求我们在编程的时候针对抽象类或者接口编程,而不是针对具体实现编程。

通俗点说:要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

依赖倒置原则的核心思想是面向接口编程。

5. 接口分离原则

核心思想:不应该强迫程序依赖它们不需要使用的方法。

其实就是说:一个接口不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该把所有的操作都封装到一个接口中。

其原则字面的意思是:使用多个隔离的接口,比使用单个接口要好。

接口隔离原则的含义是:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。

6. 迪米特原则(最少知道原则)

核心思想:一个对象应当对其他对象尽可能少的了解。

其实就是说:降低各个对象之间的耦合,提高系统的可维护性。在模块之间应该只通过接口编程,而不理会模块的内部工作原理,它可以使各个模块耦合度降到最低,促进软件的复用

通俗的来讲,就是一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类来说,无论逻辑多么复杂,都尽量地的将逻辑封装在类的内部,对外除了提供的public方法,不对外泄漏任何信息。

实际上,这些原则的目的只有一个:

  • 降低对象之间的耦合,增加程序的可复用性、可扩展性、可维护性。

优秀的设计模式就是基于这些原则去实现的。

设计模式概述

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

设计模式不是一种方法和技术,而是一种思想

设计模式和具体的语言无关,学习设计模式就是要建立面向对象的思想,尽可能的面向接口编程,低耦合,高内聚,使设计的程序可复用

学习设计模式能够促进对面向对象思想的理解,反之亦然。它们相辅相成

设计模式的分类

创建型模式: 对象的创建

结构型模式: 对象的组成(结构)

行为型模式: 对象的行为

有23种经典的设计模式,还涌现出其他的一些新的设计模式,比如:规格模式、对象池模式、雇工模式、黑板模式和空对象模式等等。后面有时间的话也会对这些模式进行分析。

创建型模式

创建型模式简单来说就是用来创建对象的。一共有五种:单例模式、建造者模式、工厂方法模式、抽象工厂模式、原型模式。

单例模式 :确保某一个类只有一个实例,并且提供一个全局访问点。
建造者模式 : 用来创建复杂的复合对象。
工厂方法模式 :让子类来决定要创建哪个对象。
抽象工厂模式 :创建多个产品族中的产品对象。
原型模式 :通过复制原型来创建新对象。

行为型模式

行为型模式主要是描述类或者对象是怎样交互和怎样分配职责的。一共有十一种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

策略模式 :封装不同的算法,算法之间能互相替换。
状态模式 :根据不同的状态做出不同的行为。
责任链模式 :将事件沿着链去处理。
观察者模式 :状态发生改变时通知观察者,一对多的关系。
模板方法模式 :定义一套流程模板,根据需要实现模板中的操作。
迭代器模式 :提供一种方法顺序访问一个聚合对象中的各个元素。
备忘录模式 :保存对象的状态,在需要时进行恢复。
访问者模式 :稳定数据结构中,定义新的操作行为。
中介者模式 :将网状结构转变为星型结构,所有行为都通过中介。
解释器模式 :定义语法,并对其进行解释。
命令模式 :将请求封装成命令,并记录下来,能够撤销与重做。

结构型模式

结构型模式主要是用于处理类或者对象的组合。一共有七种:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

代理模式 :控制客户端对对象的访问。
组合模式 :将整体与局部(树形结构)进行递归组合,让客户端能够以一种的方式对其进行处理。
适配器模式 :将原来不兼容的两个类融合在一起。
装饰者模式 :为对象添加新功能。
享元模式 :使用对象池来减少重复对象的创建。
外观模式 :对外提供一个统一的接口用来访问子系统。
桥接模式 :将两个能够独立变化的部分分离开来。

观察者模式

1.观察者模式的定义
观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式。GOF给观察者模式如下定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。

观察者模式属于行为型模式。

2.模型图:

3.该模式包含四个角色:

抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。
具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。

4.优点
解除耦合,让耦合的双方都依赖于抽象,从而使得各自的变换都不会影响另一边的变换。

5.缺点:
1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

5.使用场景例子:
有一个微信公众号服务,不定时发布一些消息,关注公众号就可以收到推送消息,取消关注就收不到推送消息,微信用户就是观察者,微信公众号是被观察.

6.具体案例

抽象被观察者

/**
 * 被观察者接口
 * 声明了添加、删除、通知观察者方法
 * Created by xiaoyehai on 2017/1/23.
 */
public interface IObservable {

    /**
     * 注册观察者
     *
     * @param observer
     */
    void registerObserver(IObserver observer);

    /**
     * 注销观察者
     *
     * @param observer
     */
    void unregisterObserver(IObserver observer);


    /**
     * 通知观察者
     * @param s
     */
    void notifyObserver(String s);
}

具体被观察者:

/**
 * 被观察者
 * Created by xiaoyehai on 2017/1/23.
 */
public class ConcreteObservable implements IObservable {

    /**
     * 观察者集合
     */
    private List<IObserver> list = new ArrayList<>();

    @Override
    public void registerObserver(IObserver observer) {
        list.add(observer);
    }

    @Override
    public void unregisterObserver(IObserver observer) {
        list.remove(observer);
    }

    @Override
    public void notifyObserver(String s) {
        //遍历观察者,通知所有观察者被观察者发生变化了
        for (IObserver observer : list) {
            observer.update(s);
        }
    }
}

抽象观察者:

/**
 * 观察者接口
 * 定义了一个update()方法,当被观察者调用notifyObservers()方法时,观察者的update()方法会被回调。
 * Created by xiaoyehai on 2017/1/23.
 */
public interface IObserver {

    void update(String s);
}

具体观察者:

/**
 * 具体观察者
 * Created by xiaoyehai on 2017/1/23.
 */
public class ConcreteObserver implements IObserver {

    private String name;

    public ConcreteObserver(String name) {
        this.name = name;
    }

    @Override
    public void update(String s) {
        System.out.println(name + "收到消息:" + s);
    }
}


编写一个测试类:

**
 * 观察者模式:
 * 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
 * 这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
 * <p>
 * 推模型
 * Created by xiaoyehai on 2017/1/23.
 */
public class Test {
    public static void main(String[] args) {
        //创建被观察者
        IObservable observable = new ConcreteObservable();

        //创建观察者
        IObserver observer1 = new ConcreteObserver("观察者1");
        IObserver observer2 = new ConcreteObserver("观察者2");
        IObserver observer3 = new ConcreteObserver("观察者2");

        //注册观察者
        observable.registerObserver(observer1);
        observable.registerObserver(observer2);
        observable.registerObserver(observer3);

        //通知观察者
        observable.notifyObserver("被观察者状态变化了");
    }
}

结果:

观察者1:被观察者状态变化了
观察者2:被观察者状态变化了
观察者3:被观察者状态变化了

7.推模型和拉模型

观察者模式分为推模型和拉模型

推模型:
主题对象向观察者推送主题的详细信息(参数),不管观察者是否需要,推送的信息通常是主题对象的全部或部分数据。

拉模型:
主题对象在通知观察者的时候,传递一个主题对象自身的引用,观察者根据需要从主题对象引用中“拉取”需要的数据。

区别:
推模型是假定主题对象知道观察者需要的数据;而拉模型是主题对象不知道观察者具体需要什么数据,观察者自己去按需要取值。

推模型可能会使得观察者对象难以复用,因为观察者的update()方法是按需要定义的参数,可能无法兼顾没有考虑到的使用情况。这就意味着出现新情况的时候,就可能提供新的update()方法,或者重构观察者;而拉模型就不会造成这样的情况,因为拉模型下,update()方法的参数是主题对象本身,这基本上是主题对象能传递的最大数据集合了,基本上可以适应各种情况的需要。

上面的例子就是推模型,现在讲下拉模型,拉模型通常都是把主题对象当作参数传递

抽象被观察者:

public interface Subject {

    //注册观察者
    public void addObserver(Observer observer);

    //移除观察者
    public void removeObserver(Observer observer);

    //通知观察者
    public void notifyObserver();

具体观察者:

/**
 * 具体的被观察者
 * Created by xiaoyehai on 2016/11/29.
 */
public class ConcreteSubject implements Subject {

    private int subjectState;

    public int getSubjectState() {
        return subjectState;
    }

    //存放观察者的集合
    private List<Observer> list = new ArrayList<>();

    @Override
    public void addObserver(Observer observer) {
        list.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        list.remove(observer);
    }

    @Override
    public void notifyObserver() {
        //遍历观察者,通知所有观察者被观察者发生变化了
        for (Observer observer : list) {
            observer.update(this);
        }
    }
}

抽象观察者:

public interface Observer {

    //当被观察者发生变化时,更新观察者, 传入主题对象
    public void update(Subject subject);
}

具体观察者:


/**
 * 具体的观察者
 * Created by xiaoyehai on 2016/11/29.
 */
public class ConcreteObserver implements Observer {

    //观察者的状态,让他和被观察者的状态保持一致
    private int observerState;

    @Override
    public void update(Subject subject) {
        observerState = ((ConcreteSubject) subject).getSubjectState();
        System.out.println("观察者的状态:" + observerState);
    }
}

测试类:

/**
 * 观察者模式:拉模型
 * 拉模型是主题对象不知道观察者具体需要什么数据,没有办法的情况下,
 * 干脆把自身传递给观察者,让观察者自己去按需要取值
 * Created by xiaoyehai on 2016/11/29.
 */
public class Test {
    public static void main(String[] args) {

        //创建被观察者
        Subject subject = new ConcreteSubject();

        //创建观察者
        Observer observer1 = new ConcreteObserver();
        Observer observer2 = new ConcreteObserver();
        Observer observer3 = new ConcreteObserver();

        subject.addObserver(observer1);
        subject.addObserver(observer2);
        subject.addObserver(observer3);

        //通知所有观察者,被观察者变化了
        subject.notifyObserver();

    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java设计模式(1):观察者模式 的相关文章

  • 设计模式---适配器模式

    适配器模式 基本介绍 适配器模式 Adapter Pattern 将某个类的接口转换成客户端期望的另一个接口表示 主的目的是兼容性 让原本因接口不匹配不能一起工作的两个类可以协同工作 其别名为包装器 Wrapper 适配器模式属于结构型模式
  • 1.单例模式之饿汉式

    单例模式总结 特点 构造方法私有 提供一个全局访问点 实现方式 有很多 分四篇分别总结1 饿汉式 2 懒汉式 3 注册式 4 ThreadLocal 优点 内存中只有一个实例 减少内存开销 避免对资源多重占用 设置全局访问点 严格控制访问
  • C++设计模式——观察者模式

    观察者模式 Observer 观察者模式是目前应用最广 影响范围最大的模式之一 因为 Observer 的一个实例Model View Control MVC 结构在系统开发架构设计中有着很重要的地位和意义 MVC实现了业务逻辑和表示层的解
  • c++观察者模式

    观察者模式 1 观察者模式简介 观察者模式也叫发布 订阅模式 模型 视图模式 源 监听器模式以及从属者模式 观察者模式定义了对象之间的一对多依赖关系 使得每当一个对象状态发生改变时 其相关依赖对象皆得到通知并被自动更新 2 实例讲解 假如张
  • Java设计模式-里氏替换原则

    里氏替换原则 Liskov Substitution Principle 定义1 如果对每一个类型为 T1的对象 o1 都有类型为 T2 的对象o2 使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时 程序 P 的行为没
  • Java开发中的23种设计模式详解

    设计模式 Design Patterns 可复用面向对象软件的基础 设计模式 Design pattern 是一套被反复使用 多数人知晓的 经过分类编目的 代码设计经验的总结 使用设计模式是为了可重用代码 让代码更容易被他人理解 保证代码可
  • 设计模式之Adapter模式

    今天这篇文章 我们来讲将设计模式中的 Adapter模式 中文就是 适配器模式 先说说一个生活中适配器模式的案例 有助于理解 现在有一个100伏特的交流电源 我现在想给笔记本充电 但是笔记本只能用12伏特的直流电 那我们是不是不能用这个电源
  • Java设计模式(9):桥接模式

    9 桥接模式 Bridge 9 1 问题引入 手机类型 现在对不同类型不同品牌的手机实现操作编程 如下手机外观类型和对应品牌 则需要编写的代码类图可能如下 带来的问题如下 如果我们需要添加一个手机 则需要在各个类型下添加手机 如果我们需要添
  • 注入多个实现类【JAVA】(设计模式之策略模式)项目实际场景【Spring boot】

    文章目录 业务场景 策略模式的概念 代码示例 1 创建一个接口类 2 创建接口类的实现类 3 创建脚手架 box类 4 最后创建一个实现工厂类 MsgBeanFactory 5 测试代码 6 输出结果 总结 业务场景 最近有一个场景消息发送
  • java设计模式——享元模式(Flyweight Pattern)

    概述 面向对象技术可以很好地解决一些灵活性或可扩展性问题 但在很多情况下需要在系统中增加类和对象的个数 当对象数量太多时 将导致运行代价过高 带来性能下降等问题 享元模式正是为解决这一类问题而诞生的 享元模式通过共享技术实现相同或相似对象的
  • 设计模式-多业务,统一入口

    比如对接一些第三方 会有异步通知 或者在第三方设置唯一回调接口 或者统一验签等场景 这个时候可能就需要我们搞一个统一入口来处理不同的业务 1 定义统一入口 RestController RequestMapping value notify
  • java设计模式——工厂方法模式(Factory Method Pattern)

    简单工厂模式虽然简单 但也受到很大限制 扩展性太差 当系统中需要引入新产品时 由于静态工厂方法通过所传入参数的不同来创建不同的产品 这必定要修改工厂类的源代码 将违背 开闭原则 如何实现增加新产品而不影响已有代码 工厂方法模式应运而生 本文
  • Head First Design Mode(15)-必以此终(模式分类及其他的设计模式)

    这即将是我所整理的设计模式的最终章 看看时间竟然已经过去了3个月了 时光太匆匆 主要内容 这里我会把我们已经学习到的设计模式进行归类划分 便于记忆 此外还会介绍下 原书中未提及的部分设计模式 做简单介绍 我们已经介绍过的设计模式 策略模式
  • Head First Design Mode(5)-工厂模式

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 工厂模式 烘烤OO的精华 烘烤某些松耦合的OO设计 除了使用new操作符之外 还有更多制造对象的方法 本章我们将了解到实例化的这个活动不应该总是公开的进行 认识到初始
  • 设计模式-责任链模式(Java)

    设计模式 责任链模式 在极客学院的视频中学习了一种设计模式的方式 责任链模式 在博客园中发现了这篇文章 讲的很详细 就把它的一些内容转载过来了 本文中 我们将介绍设计模式中的行为型模式职责链模式 职责链模式的结果看上去很简单 但是也很复杂
  • 2.C++设计模式 - 观察者模式

    class Observer public 构造 Observer 析构 virtual Observer 更新 virtual void updata class Server private 观察者链表 list
  • java装饰器模式

    一 装饰器模式定义 1 动态地给一个对象添加一些额外的职责 就增加功能来说 装饰模式相比生成子类更为灵活 Component抽象构件 Component是一个接口或者是抽象类 就是定义我们最核心的对象 也就是最原始的对象 定义一个对象接口可
  • Java设计模式(1):观察者模式

    面向对象思想设计原则 在实际的开发中 我们要想更深入的了解面向对象思想 就必须熟悉前人总结过的面向对象的思想的设计原则 1 单一职责原则 其实就是开发人员经常说的 高内聚 低耦合 也就是说 每个类应该只有一个职责 对外只能提供一种功能 而引
  • Java设计模式-结构型设计模式-适配器模式

    Java设计模式 结构型设计模式 适配器模式 从这一专栏开始将学习设计模式 上课学习和自己总结归纳的笔记将总结出来供大家参考 参考书籍 设计模式就该这样学 其他文章 Java设计模式 UML类图 Java设计模式 七大架构设计原则 开闭原则
  • 【githubshare】30 天精通 Git 版本管理,主要介绍 Git 的一些常用操作,以及日常工作中实际应用场景讲解

    GitHub 上一份开源的 Git 教程 30 天精通 Git 版本管理 主要介绍 Git 的一些常用操作 以及日常工作中实际应用场景讲解 GitHub github com doggy8088 Learn Git in 30 days 外

随机推荐

  • 【Linux】进程篇---进程概念及原理

    目录 1 什么是进程 2 操作系统是如何管理进程的 3 进程标识符 PID 3 1查看进程标识符 3 2getpid 和getppid 4 进程当前状态 4 1进程状态粗分 4 2Linux下进程状态 4 2 1linux下进程状态概念 4
  • 【深度学习】端到端的“即插即用“卷积模块以替代传统Conv层

    文章参考 大盘点 十大即插即用的涨点神器 360doc com CompConv 一种用于高效特征学习的紧凑型卷积模块 知乎 zhihu com 紧凑型深度卷积神经网络在图像识别中的应用 ceaj org
  • 浪潮服务器通过DHCP获取地址进入IPMI,BMC管理后台的方法,可实现远程安装系统、温度运行状态监测、风扇转速调整、远程开关机、KVM控制台显示器等功能

    前言 这里主要介绍通过DHCP进入BMC管理后台的方法 在官方网站有介绍的地方会直接给链接 这里就不在赘述 配置网络 DHCP获取地址 这个方法适用于没有手动设置过BMC地址的情况 这里用到的DHCP工具是 深度远程启动管理器 深度远程启动
  • 面试准备:MySQL建立索引的原则

    文章目录 建立索引 1 和in可以乱序 2 最左前缀匹配原则 3 尽量选择区分度高的列作为索引 4 索引列不能参与计算 5 尽量的扩展索引 不要新建索引 6 为经常需要排序 分组和联合操作的字段建立索引 7 为常作为查询条件的字段建立索引
  • 【山河送书第十一期】:朋友圈大佬都去读研了,这份备考书单我码住了,考研书籍五本!!

    朋友圈大佬都去读研了 这份备考书单我码住了 数据结构与算法分析 计算机网络 自顶向下方法 现代操作系统 深入理解计算机系统 概率论基础教程 原书第10版 线性代数 原书第10版 线性代数及其应用 重磅推荐 参与方式 往期赠书回顾 八九月的朋
  • AlmaLinux 安装过程解析

    此文将对AlmaLinux操作系统安装过程进行解析 对于经常使用Linux系统的大佬 可能对此安装过程有些乏味 但鉴于目前为止 似乎没有一篇安装的过程解析 那不妨由笔者写下一篇吧 笔者软件安装环境 VMware VMware Worksta
  • 提升模型效果的途径

    模型效果不佳 可以考虑从以下几个方面进行改进 数据增广 1 基于图像处理的数据增广 几何变换 旋转 缩放 翻转 剪裁 平移 仿射变换 颜色空间变换 亮度 对比度 饱和度调整 颜色空间转行 色彩调整 添加噪声和滤波 注入高斯噪声 椒盐噪声 模
  • Python模糊控制库使用(基本操作与仿真结果3D显示)

    Python模糊控制库使用 模糊控制库安装 示例 定义模糊控制变量 模糊隶属函数 模糊规则 激活模糊控制器 3D可视化结果 完整代码 模糊控制库安装 模糊控制库github 链接 Github python pip安装 pip instal
  • 第三十九章、PyQt显示部件:OpenGL Widget部件功能简介及使用其显示图片

    专栏 Python基础教程目录 专栏 使用PyQt开发图形界面Python应用 专栏 PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一 概述 OpenGL Widget部件是一个OpenGL Open Graphics L
  • java反射机制 (属性,注解)(代码)

    博学谷IT学习技术支持 1案例的类 import com example demo3 fanshe MyAnnotation import lombok Data author zw Description 描述 create 2022 2
  • YOLOv8+BoT-SORT多目标跟踪(行人车辆计数与越界识别)

    课程链接 https edu csdn net course detail 38919 BoT SORT是发表于2022年的先进的多目标跟踪算法 它结合了运动和外观信息 相机运动补偿和更准确的卡尔曼滤波状态向量 并把这些改进集成到ByteT
  • vue的环境搭建2023,idea,vscode踩坑记录

    由于看了19 20年的几篇博客 导致搭建vue环境一部分环节出大问题 大家还是看官方文档吧 血泪教训 不说废话直接开始 1 nodejs下载 下载地址 https nodejs org zh cn 下载稳定版 安装过程我是一路next 就是
  • python之折半查找算法

    折半查找算法也叫二分查找算法 算法的细节我就不讲了 但是必须说一下二分查找是基于我们之前的数据是有序的 如果没有序该算法是没有意义的 个人觉得代码比较直观 所以我这里就直接上代码了 折半查找非递归算法 折半查找非递归算法 折半查找函数 参数
  • 实验二 势函数算法的迭代训练

    实验二 势函数算法的迭代训练 一 实验目的 通过本实验的学习 使学生了解或掌握模式识别中利用势函数思想设计非线性判别函数的方法 能够实现模式的分类 学会运用已学习的先导课程如数据结构和算法设计知识 选用合适的数据结构完成算法的设计和程序的实
  • Python获取文件名和文件类型

    def get file info path dir path file full name os path split path file name file type os path splitext file full name re
  • [搬家前]代码走查

    代码走查 就是一群人一起 对别人写的代码进行分析 在算法上 在具体实现上 提出改进的意见 以使得程序更加健壮 更加有效率 今天对我写的一个Java Mail程序进行走查 自我感觉写得是有点丑 但是基本功能还是实现得很好的 经过走查 我收获很
  • 基于SpringBoot的高校党务管理系统

    系列文章目录 基于PHP的旅游管理系统 基于SSM的毕业设计管理系统 基于SpringBoot的高校在线答疑管理系统 目录 系列文章目录 一 相关技术 二 系统功能 三 系统页面 1 管理员功能页面 2 学生功能页面 3 党组织功能页面 4
  • 2021年安装deepin20.3和windows双系统

    2021年安装deepin20 3和windows双系统 1 前言 如你所见deepin最近发布了它的社区版20 3 这次带来几个重要的更新 更强大的内核版本 Stable内核升级到5 15版本 增强对Intel 12代U和NTFS文件系统
  • 利用dup函数实现基本的CGI服务器

    复制文件描述符的dup和dup2函数 include
  • Java设计模式(1):观察者模式

    面向对象思想设计原则 在实际的开发中 我们要想更深入的了解面向对象思想 就必须熟悉前人总结过的面向对象的思想的设计原则 1 单一职责原则 其实就是开发人员经常说的 高内聚 低耦合 也就是说 每个类应该只有一个职责 对外只能提供一种功能 而引