设计模式

2023-05-16

面向对象设计原则

每个对象是拥有独立责任的抽象体
真正的复用是源代码不做修改,编译+测试之后就不会再修改。

设计原则

1、依赖倒置原则(DIP)
1)高层模块(稳定)的变化不应该依赖于底层模块(变化),二者都应该依赖于抽象。
2)抽象不应该依赖于实现细节,实现细节应该依赖于抽象。
举例:Shape类 <-- Line类 , 抽象不依赖具体实现。

2、开放封闭原则(OCP)
1)对拓展开发,对更改封闭
2)类模块应该是可拓展的,但是不可修改
举例:木材公司建造一批木材,现在新的需求是需要防火。 那么开放封闭原则要求你应该对现有的产品进行拓展,而不是修改。 修改:拆了重做 ; 拓展:刷上一层防火漆。

3、单一责任原则(SRP)
1)一个类应该仅有一个引起它变化的原因。
2)类的方向隐含类的责任。

4、Liskov替换原则
1)子类必须能够替换它的基类(IS-A)
2)继承表达类型抽象。
举例:子类拿到调用父类的地方上也能用。 有的人喜欢在子类重写父类的方法,并且抛出异常,这就违背了替换原则。

5、接口隔离原则(ISP)
1)接口应该小而完备(强调方法的权限修饰)
2)不应该强迫客户程序依赖于他们不用的方法。

6、优先使用对象组合,而不是类继承
0)类继承通常是“白箱复用”,组合是”黑箱复用“;
1)继承在某种程序破坏了封装性(父类给子类暴露的接口很多),子类父类耦合度高
2)对象组合只要求被组合的对象具有良好的接口定义,耦合度低。

7、封装变化点
使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行修改而不会影响对另一侧产生不良影响。

8、针对接口编程,而不是针对实现编程
客户端无需获取对象的具体类型,只需要知道对象的接口

具体模式

一定要理解在什么时候,什么地方使用设计模式
抉择一个设计模式,方式是重构,迭代,得到设计模式

重构的技巧
  • 静态 -> 动态
  • 早绑定 -> 晚绑定
  • 继承->组合
  • 编译时 -> 依赖运行时依赖
  • 紧耦合 -> 松耦合

一、组件协作模式

模板方法 Template Method

动机:该任务具有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者是在类似框架和应用的关系下,有些具体实现要比整体实现来得晚。

定义了一个算法的稳定骨架,将某些方法的加载延迟到子类中。
这样使得子类不改变(复用)一个算法的结构就能重定义该算法的某些步骤。
两个要点:1)算法的骨架是稳定的。 2)变化在于算法的实现步骤。
核心:你别调用我,我来调用你。

红色表示稳定部分,蓝色表示变化部分。
在这里插入图片描述

策略模式 Strategy

一款计算税收的软件,在一开始的需求只有三个国家,业务拓展之后,增加了需求。 下面这款设计方式违背了开放封闭原则,而且有很多if else 中的算法是不会被使用到的,但是都会被装载到内存。

在这里插入图片描述

动机(Movtivation)
  • 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。
  • 如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?
策略模式的解决方案

定义一系列算法,把它们一个个封装起来,并且使他们可互相替换(变化)。使得客户端得以稳定,尽管算法是拓展的。
要点:可以在运行时方便地根据需求在各个算法之间进行切换
在这里插入图片描述

观察者模式 Observer

情景:在UI设计中,经常有这种需求,上传文件,通知进度。
那么代码结构大概是这样的:
UploadForm中, 1) 开启事件–上传文件 2)向事件传入一个通知引用,表示进度的展现方式。3)通知模型引用在上传事件中会被修改,那么在UploadForm就可以根据通知模型获取到进度,渲染即可。

在UploadEvent中,1)执行上传动作 2)根据上传进度, 修改通知模型。

一、创建型(6种)

1、单例模式(Singleton)

解释UML

1)私有的数据成员
2)私有的构造方法
3)公共的getUniqueInstance()方法
在这里插入图片描述

双重检查
public class Singleton {  
  
    /* 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载 ,使用volatile放在jvm指令重排*/  
    private static volatile Singleton instance = null;  
  
    /* 私有构造方法,防止被实例化 */  
    private Singleton() {  
    }  
  
    /* 静态工程方法,创建实例 */  
    public static Singleton getInstance() {  
        if (instance == null) {  
        	synchronized (Singleton.class){
        		if(instance == null)
     				instance = new Singleton();  
    	 	}
    	 }  
        return instance;  
    }  
  
    /* 如果该对象被用于序列化,可以保证对象在序列化前后保持一致 */  
    public Object readResolve() {  
        return instance;  
    }  
}  

注意双重锁检查时,对象要加上volatile:
uniqueInstance = new Singleton();分为以下几步执行
1)为uniqueintsance分配内存
2)初始化
3)将uniqueInstance指向分配的内存地址
因为JVM具有指令重排,不保证指令的执行顺序。所以执行顺序可能编程 1>3>2, 当线程T1执行了1) 3),然后线程T2调用getUniqueInstance()发现 uniqueInstance 不为空(因为存在内存空间),实际上uniqueInstance并未初始化完成。 加上volatile可以防止JVM重排指令。

https://blog.csdn.net/qq_37591656/article/details/86774476

2、简单工厂

解释UML

客户端client调用SimpleFactory,对具体的product进行生产,客户端使用的是Interface的Product
在这里插入图片描述
举例如下:(我们举一个发送邮件和短信的例子)
在商品之间抽取共性,之后在工厂之中根据不同的信息生产不同的商品,但是可以依据共性生产出基类

首先创建邮件和短信的共同接口

public interface Sender {  
    public void Send();  
}

实现类

public class MailSender implements Sender {  
    @Override  
    public void Send() {  
        System.out.println("this is mailsender!");  
    }  
}  
public class SmsSender implements Sender {  
  
    @Override  
    public void Send() {  
        System.out.println("this is sms sender!");  
    }  
}  

多个静态方法的工厂

public class SendFactory {  
      
    public static Sender produceMail(){  
        return new MailSender();  
    }  
      
    public static Sender produceSms(){  
        return new SmsSender();  
    }  
}  

3、工厂方法

具体的工厂concreteFactory生产具体的产品conreteProduct
在这里插入图片描述
工厂模式存在一个问题,类的创建依赖于工厂类,要是进行业务拓展,那么就必须修改工厂类,违背了闭包原则。因此创建工厂的接口,需要拓展业务时,增加新的工厂实现类即可

工厂的接口

interface Provider{
	public Sender produce();
}

工厂的实现类都是根据业务进行编写的,下面是短信工厂

public class SendSmsFactory implements Provider{  
  
    @Override  
    public Sender produce() {  
        return new SmsSender();  
    }  
}  

4、抽象工厂

解释UML

客户端调用AbstractFactory对象生产AbstractProductA,AbstractProductB。
具体工厂ConcreteFactory生产具体的Product。
在这里插入图片描述
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。(产品是树状结构一样具有家族系特征)
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以针对一个抽象产品,可以生产出多个具体产品类。每个具体工厂生产整个系的产品。

大部分的抽象工厂呈现出来都是这样样子的,每个具体实现类(或者接口)里面是很多工厂方法,每个工厂方法对应生产某种类型。

抽象工厂着重点在于创建出哪类产品,接口是对准了某个抽象产品的整套具体产品。例如工厂可以生产鼠标和键盘。那么抽象工厂的实现类(具体的某个工厂)都可以生产鼠标和键盘,但是工厂A生产的鼠标和键盘是罗技的(罗技1系 2系等等)系列, 工厂B生产的是微软的。

工厂方法更像流水线, 抽象工厂才像工厂。

5、建造者模式

客户端直接访问Director进行生产。
Director和Builder是聚合关系(成员变量,需要在构造方法里传入),具体的生产者ConcreteBuilder进行生产。
在这里插入图片描述

用户不需要知道对象建造的过程,只需**表明自己要创建的类型和内容 **

优点
  • Builder是接口,因为装机任务会有很多样,比如有人要联想的机器,有人要神舟的机器。因此方便增加创建者和删除创建者
  • 分步骤进行构造复杂的对象
缺点

创建的产品一般具备较多的共同点,

6、原型模式(prototype)

客户端直接调用Prototype抽象类,具体的Prototype重写clone(),返回对象。
在这里插入图片描述
科大讯飞笔试出现过UML图

把对象作为原型,对其进行赋值,产生一个和原对象类似的新对象。这里关心浅赋值和深赋值问题

  • 浅拷贝:只是对基本数据类型做拷贝,引用类型指向的还是原来的地址
  • 深拷贝:引用类型也新开辟了一份空间(通过序列化或者二进制流写到缓冲)
 /* 浅复制 */  
    public Object clone() throws CloneNotSupportedException {  
        Prototype proto = (Prototype) super.clone();  
        return proto;  
    }  
  
    /* 深复制 */  
    public Object deepClone() throws IOException, ClassNotFoundException {  
  
        /* 写入当前对象的二进制流 */  
        ByteArrayOutputStream bos = new ByteArrayOutputStream();  
        ObjectOutputStream oos = new ObjectOutputStream(bos);  
        oos.writeObject(this);  
  
        /* 读出二进制流产生的新对象 */  
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());  
        ObjectInputStream ois = new ObjectInputStream(bis);  
        return ois.readObject();  
    }  

二、行为型

1、责任链模式(Chain Of Responsibility)

Handler抽象类:1)Handler类型的successor属性(字段);2)handleRequest()方法,用于处理某种请求。

因此如何实现责任链呢?
先有不同的ConcreteHandler handler对象
构造逻辑先后关系:把下一个处理请求的handler,放到上一个handler的successor中。
每一个handler根据特点请求,进行捕捉处理,不然就放到successor去处理。

在这里插入图片描述

concreteHandler的代码
public class ConcreteHandler1 extends Handler {

    public ConcreteHandler1(Handler successor) {
        super(successor);
    }

    @Override
    protected void handleRequest(Request request) {
        if (request.getType() == RequestType.TYPE1) {
            System.out.println(request.getName() + " is handle by ConcreteHandler1");
            return;
        }
        if (successor != null) {
            successor.handleRequest(request);
        }
    }
}
Client的代码
public class Client {

    public static void main(String[] args) {

        Handler handler1 = new ConcreteHandler1(null);
        Handler handler2 = new ConcreteHandler2(handler1); // 构造链的关系

        Request request1 = new Request(RequestType.TYPE1, "request1");
        handler2.handleRequest(request1);

        Request request2 = new Request(RequestType.TYPE2, "request2");
        handler2.handleRequest(request2);
    }
}

2、命令(Command)

在这里插入图片描述

二、结构模式(7种)

https://www.cnblogs.com/geek6/p/3951677.html

在这里插入图片描述

6、适配器模式

将某个源类的接口转换成客户端期望的另一个接口,消除接口不匹配所造成的兼容性问题。分为类的适配器、对象的适配器、接口的适配器。

6.1 类的适配器模式

设计一个新类继承Sources源类,并且实现新功能的接口,这样新类就能用到接口上。

public class Sources {
    public void method1() {
        System.out.println("this is ordinary method");
    }

    public static void main(String[] args) {
        TargetImpl impl = new TargetImpl();
        impl.method2();
        impl.method1();
    }
}
interface Targetable{
    public void method1();
    public void method2();

}
class TargetImpl extends Sources implements Targetable {
    @Override
    public void method2() {
        System.out.println("this is new method");
    }
}

6.2 对象的适配器

Adapter中,不继承源类,而是把源类组合进来,并且实现接口。

class TargetImpl  implements Targetable {
    Sources sources;
    @Override
    public void method1() {
        sources.method1();
    }
    @Override
    public void method2() {
        System.out.println("this is new method");
    }
}

6.3 接口的适配器

有时我们写了一个接口,但是它所有的实现类必须实现全部的方法,这点比较麻烦。为了解决这个问题,就创建了一个抽象类,接口的实现类只和抽象类进行打交道,抽象类再实现所有接口的方法。

抽象类
public abstract class Wrapper2 implements Sourceable{  
    public void method1(){}  
    public void method2(){}  
}  
6.4总结
  • 类的适配器模式:当Source类要转换成满足另一个接口的类时,通过继承Source并且继承接口的Adapter类来完成.
  • 对象的适配器模式:把一个对象转换成满足某个接口的对象,通过实现一个Adapter类持有该对象,并实现接口即可
  • 接口的适配模式:不希望实现接口的所有方法,因此创建一个抽象类去实现所有方法(莫名觉得怪怪的)。实现类去继承这个抽象类,并重写自己想要的方法。

7、装饰模式(Decorator)

给对象添加一些新功能,Source是被装饰对象,Decorator是装饰类,他们都要实现同一个接口。
适用场景:

  • 需要拓展一个类的功能
  • 动态的为对象增加功能,还能动态的撤销(增加的话就调用装饰者,删除就调用Source)。
interface Sourceable{
    public void method();
}
class Source implements Sourceable{

    @Override
    public void method() {
        System.out.println("ordanary method");
    }
}


public class Decorator implements Sourceable {
    private Sourceable sourceable;
    public  Decorator(Sourceable sourceable){
        this.sourceable = sourceable;
    }
    @Override
    public void method() {
        System.out.println("before method");
        sourceable.method();
        System.out.println("after method");
    }

    public static void main(String[] args) {
        new Decorator(new Source()).method();
    }
}

8、代理模式

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

设计模式 的相关文章

  • c语言实现面向对象编程(const * ,* const)

    c语言实现面向对象编程 面向对象思想 封装 继承 多态 代码实现 函数签名及返回值的约定 const 重载 参考了onlyshi的博客代码 orz传送门 参考了嵌入式实践一些代码 这里就不加了 面向对象思想 面向对象编程 OOP 并不是一种
  • C++设计模式(8)——命令模式

    命令模式 亦称 动作 事务 Action Transaction Command 意图 命令模式是一种行为设计模式 它可将请求转换为一个包含与请求相关的所有信息的独立对象 该转换让你能根据不同的请求将方法参数化 延迟请求执行或将其放入队列中
  • 常用设计模式总结

    设计模式的相关知识 很多书籍和博客中都有详细总结 本文总结的目的 1 将自己学习到的设计模式的知识按照自己的逻辑重新总结 方便查看和记忆 2 方便让自己对设计模式中常用的知识有一个系统的认知 设计模式 话设计模式 书中提到 24 种设计模式
  • 行为型模式-策略模式

    package per mjn pattern strategy 抽象策略类 public interface Strategy void show package per mjn pattern strategy 具体策略类 用来封装算法
  • java需会(转载)

    一 基础篇 1 1 Java基础 面向对象的特征 继承 封装和多态 final finally finalize 的区别 Exception Error 运行时异常与一般异常有何异同 请写出5种常见到的runtime exception i
  • 设计模式——简单工厂模式

    简单工厂模式定义为 简单工厂模式又称为静态工厂方法模型 它属于类创建型模式 在简单工厂模式中 可以根据参数的不同返回不同类的实例 简单工厂专门定义一个类来负责创建其他类的实例 被创建的实例通常都具有共同的父类 简单工厂模式结构图 简单工厂模
  • 程杰“大话设计模式”中的设计原则

    单一职责原则 SRP 就一个类而言 应该仅有一个引起它变化的原因 如果一个类承担的职责过多 就等于把这些职责耦合在了一起 一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力 这种耦合会导致脆弱的设计 当发生变化时 设计会遭受到意想不到
  • 设计模式--Abstract server模式 VS Adapter 模式

    适配器类似于现实世界里面的插头 通过适配器 我们可以将分属于不同类的两种不同类型的数据整合起来 而不必去根据某一需要增加或者修改类里面的方法 Adapter mode和Proxymode的区别 Proxy的关注点是职能转移 通过引入Prox
  • 分享几个项目中用到的设计模式

    前言 之前项目中出于扩展性和有雅性的考虑 使用了多种设计模式进行项目框架的设计 主要的一些设计模式是单例模式 工厂模式 策略模式 责任链模式 代理模式这几种 现在依次讲讲这几个的主要是实现方式和在我们项目中的应用场景 核心设计模式分享 单例
  • 每日一问:你想如何破坏单例模式?

    前言 1 单例是什么 单例模式 是一种创建型设计模式 目的是保证全局一个类只有一个实例对象 分为懒汉式和饿汉式 所谓懒汉式 类似于懒加载 需要的时候才会触发初始化实例对象 而饿汉式正好相反 项目启动 类加载的时候 就会创建初始化单例对象 1
  • HeadFirst 设计模式学习笔记10——MVC分析

    1 M V C Model View Controller 模式 视图 控制器 这是一种范型 模型对象正是应用系统存在的理由 你设计的对象 包含了数据 逻辑和其他在你的应用领域创建定制的类 视图通常是控件 用来显示和编辑 控制器位于二者中间
  • Tomcat 系统架构与设计模式之工作原理篇

    本文以 Tomcat 5 为基础 也兼顾最新的 Tomcat 6 和 Tomcat 4 Tomcat 的基本设计思路和架构是具有一定连续性的 Tomcat 总体结构 Tomcat 的结构很复杂 但是 Tomcat 也非常的模块化 找到了 T
  • [设计模式]模板方法模式(Template Method)

    1 意图 定义一个操作中的算法的骨架 而将一些步骤延迟到子类中 TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 2 动机 其实就是如意图所描述的 算法的骨架是一样的 就是有些特殊步骤不一样 就可以
  • 【设计模式】工厂模式(Factory Pattern)

    1 概述 工厂模式 Factory Pattern 是最常用的设计模式之一 它属于创建类型的设计模式 它提供了一种创建对象的最佳方式 在工厂模式中 我们在创建对象时不会对客户端暴露创建逻辑 并且是通过一个共同的接口来指向新创建的对象 工厂模
  • 哈工大2020软件构造Lab3实验报告

    本项目于4 21日实验课验收 更新完成 如果有所参考 请点点关注 点点赞GitHub Follow一下谢谢 2020春计算机学院 软件构造 课程Lab3实验报告 Software Construction 2020 Spring Lab 3
  • 泛型与反射机制在JDBC和Servlet编程中的实践

    写在前面 泛型与反射是java中的两种强大机制 可以很好的提高代码的灵活性和复用性 本篇文章向大家展现在JDBC和Servlet编程场景下反射和泛型技术的实践 通过灵活使用这两种机制打造 高度可复用的JDBC和Servlet代码 1 JDB
  • 设计模式(3)--对象结构(5)--外观

    1 意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口 这个接口使得 这一子系统更加容易使用 2 两种角色 子系统 Subsystem 外观 Facade 3 优点 3 1 对客户屏蔽了子系统组件 减少了客户处
  • 设计模式(三)-结构型模式(4)-组合模式

    一 为何需要组合模式 Composite 在代码设计中 有种情况是对象之间存在层次关系 即对象之间会存在父结点和子结点的关系 比如在文件管理系统中 所有文件和文件夹形成树状结构 文件夹目录里存在子文件夹和文件 文件夹属于枝结点 文件属于叶结
  • 自动化测试面试题(附答案)

    1 自动化代码中 用到了哪些设计模式 单例设计模式 工厂模式 PO设计模式 数据驱动模式 面向接口编程设计模式 2 什么是断言 Assert 断言Assert用于在代码中验证实际结果是不是符合预期结果 如果测试用例执行失败会抛出异常并提供断
  • C++设计模式 --1.工厂模式和单例模式

    文章目录 1 工厂模式 简单工厂模式 工厂方法模式 抽象工厂模式 2 单例模式 懒汉式 饿汉式 1 工厂模式 简单工厂模式

随机推荐

  • Boost库编译指南

    1 Boost 库简介 Boost 是一个开源的 C 43 43 库集合 xff0c 提供了许多高质量的库 xff0c 涵盖了许多不同的领域 xff0c 如智能指针 多线程编程 正则表达式 数学库等等 Boost 的目标是提高 C 43 4
  • 解决Flask中出现的跨域问题has been blocked by CORS policy: No ‘Access-Control-Allow-Origin‘ header...

    今天在用flask做接口进行本地调用测试时发现调用报错 如图所示 解决办法 xff1a 在项目目录打开终端 xff0c 安装以下库 pip install U flask cors 再在代码中插入 CORS app resources 61
  • 【Web笔记】Html学习手册

    HTML简介 HTML是 超文本标记语言 xff08 HyperText Markup Language xff09 的简称 HTML的前世今生 从初期的网络诞生后 xff0c 已经出现了许多HTML版本 版本发布时间HTML1991HTM
  • webrtc-kurento

    WebRTC 呼叫者通过 navigator mediaDevices getUserMedia en US 捕捉本地媒体 呼叫者创建一个RTCPeerConnection 并调用 RTCPeerConnection addTrack 注
  • windows10远程连接centos图像化桌面步骤和遇到的问题

    一 安装配置XRDP 首先需要切换到root用户下 xff1b 1 安装epel库 1 xff09 检测系统是否已经安装epel库 rpm qa grep epel 2 xff09 安装epel库 yum install epel rele
  • linux磁盘分区、挂载、扩容

    1 fdisk l 查看磁盘情况 xff0c 可以看到总共4块磁盘 xff0c sda是系统盘及根目录 xff0c 剩余sdb sdc sdd三块磁盘可用 root 64 openEuler dev fdisk l Disk dev sdd
  • QT 线程之QWaitCondition(深入理解)

    QWaitCondition 允许线程在某些情况发生时唤醒另外的线程 一个或多个线程可以阻塞等待一QWaitCondition 用wakeOne 或wakeAll 设置一个条件 wakeOne 随机唤醒一个 xff0c wakeAll 唤醒
  • Qt QMessageBox使用详解

    本文详细的介绍了QMessageBox控件的各种操作 xff0c 例如 xff1a 消息提示框的使用 判断消息提示框的按钮 标准图标和自定义图标 定时关闭 自定义样式等操作 本文作者原创 xff0c 转载请附上文章出处与本文链接 Qt QM
  • C++ permutation排列算法详解(深入了解,一文学会)

    排列就是一次对对象序列或值序列的重新排列 例如 xff0c ABC 中字符可能的排列是 xff1a 34 ABC 34 34 ACB 34 34 BAC 34 34 BCA 34 34 CAB 34 34 CBA 34 三个不同的字符有 6
  • QT QMenuBra QMenu QAction 菜单栏 操作详解

    本文详细的介绍了QMenuBra QMenu QAction 菜单栏的各种操作 xff0c 例如操作 xff1a 新建界面 加入菜单项 加入子菜单 新建二级子菜单 QAction分隔符 pMenuBar 点击信号 触发信号 设置图标 设置禁
  • 网络编程POSIX规范要求数据类型

    数据类型 说明 来源 int8 t 带符号8位整数 lt sys types h gt uint8 t 无符号8位整数 lt sys types h gt int16 t 带符号16位整数 lt sys types h gt uint16
  • 解决ajax的delete、put方法接受不到参数的问题

    通过修改配置文件来实现Put和Delete请求的参数传递的问题 在web xml中添加如下代码 xff1a lt filter gt lt filter name gt HttpMethodFilter lt filter name gt
  • - Dockerfile 指令、构建过程

    查看Dockerfile中可以使用的全部指令 xff1a lt http docs docker com reference builder gt 制作Docker image 有两种方式 xff1a 一是使用 Docker contain
  • python正则表达式匹配邮箱地址是否合法

    题目 xff1a 1 xff09 请尝试写一个验证Email地址的正则表达式 版本一应该可以验证出类似的Email xff1a someone 64 gmail com bill gates 64 microsoft com 2 xff09
  • 公网IP和内网IP的区别? 什么是127.0.0.1?

    IP地址是设备在网络上的唯一标识符 xff0c 比如无线路由器有两个IP xff0c 公网IP xff08 例如100 78 118 73 连接互联网 xff0c 私有 xff08 内网 xff09 IP xff08 如192 168 1
  • 计算机网络课程设计之Tracert与Ping 程序设计与实现

    一 预备知识 ICMP ICMP的报文是封装在IP数据部分中的 按照我的理解 xff0c ICMP就是在网络层中 xff0c 反馈一些转发 访问等操作时的附带信息 ICMP分为两种 xff0c ICMP差错报告报文 xff08 IP传输时的
  • 计算机网络课程设计之网络聊天程序的设计与实现

    TCP和UDP在接收方的区别 xff08 实际上本实验中用不着 xff09 UDP 协议 User Datagram Protocol 用户数据报协议 xff0c 是一 种保护消息边界的 xff0c 不保障可靠数据的传输 就是指传输协议把数
  • 计算机网络课程设计之嗅探器实现

    资料来源网络 xff0c 侵权请联系删除 原理 简单说明一下什么是网络嗅探器 xff0c 网络嗅探器是一个抓取所有经过网卡数据的软件 xff0c 在一般使用电脑时 xff0c 网卡只接受到发送至本机的数据 xff0c 那是因为这是网卡是非混
  • 牛客网高级项目总结

    1 注册和登陆 登陆和注册成功之后 xff0c 在cookie里添加上token xff0c 另外在数据库中插入包含token userId的表 xff0c 用于登陆状态检验 具体检验是在拦截器上进行 xff0c 拦截器的实现过程 xff1
  • 设计模式

    面向对象设计原则 每个对象是拥有独立责任的抽象体 真正的复用是源代码不做修改 xff0c 编译 43 测试之后就不会再修改 设计原则 1 依赖倒置原则 xff08 DIP xff09 1 xff09 高层模块 xff08 稳定 xff09