C#常见的设计模式-行为型模式

news2024/11/24 20:21:35

前言

行为型模式是面向对象设计中的一类设计模式,它关注对象之间的通信和相互作用,以实现特定的行为或功能。在C#中,有许多常见的行为型模式,下面将对其中10种行为型模式进行介绍,并给出相应的代码示例。
在这里插入图片描述


目录

    • 前言
    • 1. 命令模式(Command)
      • 示例代码
      • 解释
    • 2. 解释器模式(Interpreter)
      • 示例代码
      • 解释
    • 3. 迭代器模式(Iterator)
      • 示例代码
      • 解释
    • 4. 中介者模式(Mediator)
      • 示例代码
      • 解释
    • 5. 备忘录模式(Memento)
      • 示例代码
      • 解释
    • 6. 观察者模式(Observer)
      • 示例代码
      • 解释
    • 7. 状态模式(State)
      • 示例代码
      • 解释
    • 8. 策略模式(Strategy)
      • 示例代码
      • 解释
    • 9. 模板方法模式(Template Method)
      • 示例代码
      • 解释
    • 10. 访问者模式(Visitor)
      • 示例代码
      • 解释


1. 命令模式(Command)

命令模式将请求封装成一个对象,从而使得请求发送者和接收者解耦。

示例代码

// 命令接口
public interface ICommand
{
    void Execute();
}

// 具体命令类
public class ConcreteCommand : ICommand
{
    private Receiver _receiver;

    public ConcreteCommand(Receiver receiver)
    {
        _receiver = receiver;
    }

    public void Execute()
    {
        _receiver.Action();
    }
}

// 接收者类
public class Receiver
{
    public void Action()
    {
        Console.WriteLine("执行命令");
    }
}

// 客户端类
public class Client
{
    public void Main()
    {
        Receiver receiver = new Receiver();
        ICommand command = new ConcreteCommand(receiver);

        // 客户端只需调用命令的执行方法即可
        command.Execute();
    }
}

解释

在上面的示例中,ICommand接口定义了命令的统一执行方法Execute()ConcreteCommand是具体的命令类,通过调用ReceiverAction()方法来实现对请求的处理。客户端通过实例化具体的命令对象,并调用其执行方法来发出请求。

2. 解释器模式(Interpreter)

解释器模式定义了一种语言文法的表示,并定义了一个解释器来解释语言中的句子。

示例代码

// 抽象表达式类
public abstract class AbstractExpression
{
    public abstract void Interpret(Context context);
}

// 终结符表达式类
public class TerminalExpression : AbstractExpression
{
    public override void Interpret(Context context)
    {
        Console.WriteLine("解释终结符表达式");
    }
}

// 非终结符表达式类
public class NonterminalExpression : AbstractExpression
{
    public override void Interpret(Context context)
    {
        Console.WriteLine("解释非终结符表达式");
    }
}

// 上下文类
public class Context
{
    public string Input { get; set; }
    public string Output { get; set; }
}

// 客户端类
public class Client
{
    public void Main()
    {
        Context context = new Context();
        List<AbstractExpression> expressions = new List<AbstractExpression>();
        
        expressions.Add(new TerminalExpression());
        expressions.Add(new NonterminalExpression());

        foreach (AbstractExpression expression in expressions)
        {
            expression.Interpret(context);
        }
    }
}

解释

在上面的示例中,AbstractExpression是抽象表达式类,由TerminalExpressionNonterminalExpression继承,并分别实现了解释终结符和非终结符表达式的方法。Context类存储解释器的上下文信息。客户端通过实例化具体的解释器对象,并调用其解释方法来实现对句子的解释。

3. 迭代器模式(Iterator)

迭代器模式提供一种顺序访问集合对象元素的方法,而不需要暴露集合对象的内部结构。

示例代码

// 迭代器接口
public interface IIterator<T>
{
    bool HasNext();
    T Next();
}

// 集合接口
public interface ICollection<T>
{
    IIterator<T> CreateIterator();
}

// 具体集合类
public class ConcreteCollection<T> : ICollection<T>
{
    private List<T> _items = new List<T>();

    public void Add(T item)
    {
        _items.Add(item);
    }

    public IIterator<T> CreateIterator()
    {
        return new ConcreteIterator<T>(this);
    }

    public T GetItem(int index)
    {
        return _items[index];
    }

    public int Count
    {
        get { return _items.Count; }
    }
}

// 具体迭代器类
public class ConcreteIterator<T> : IIterator<T>
{
    private ICollection<T> _collection;
    private int _position = 0;

    public ConcreteIterator(ICollection<T> collection)
    {
        _collection = collection;
    }

    public bool HasNext()
    {
        return _position < _collection.Count;
    }

    public T Next()
    {
        T item = _collection.GetItem(_position);
        _position++;
        return item;
    }
}

// 客户端类
public class Client
{
    public void Main()
    {
        ICollection<string> collection = new ConcreteCollection<string>();
        collection.Add("Item 1");
        collection.Add("Item 2");
        collection.Add("Item 3");

        IIterator<string> iterator = collection.CreateIterator();
        while (iterator.HasNext())
        {
            string item = iterator.Next();
            Console.WriteLine(item);
        }
    }
}

解释

在上面的示例中,IIterator<T>定义了迭代器接口,ICollection<T>定义了集合接口,并包含一个创建迭代器的方法CreateIterator()ConcreteCollection<T>是具体的集合类,实现了集合接口,并在CreateIterator()方法中返回具体的迭代器对象ConcreteIterator<T>。客户端通过调用集合的CreateIterator()方法来获取迭代器,并可以通过迭代器的HasNext()Next()方法依次访问集合中的元素。

4. 中介者模式(Mediator)

中介者模式定义了一个中介对象来封装一组对象之间的交互,使得这些对象之间不需要直接相互通信。

示例代码

// 中介者接口
public interface IMediator
{
    void SendMessage(string message, Colleague colleague);
}

// 同事类
public abstract class Colleague
{
    protected IMediator _mediator;

    public Colleague(IMediator mediator)
    {
        _mediator = mediator;
    }

    public abstract void ReceiveMessage(string message);
    public abstract void SendMessage(string message);
}

// 具体同事类
public class ConcreteColleagueA : Colleague
{
    public ConcreteColleagueA(IMediator mediator) : base(mediator) { }

    public override void ReceiveMessage(string message)
    {
        Console.WriteLine("Colleague A received: " + message);
    }

    public override void SendMessage(string message)
    {
        _mediator.SendMessage(message, this);
    }
}

public class ConcreteColleagueB : Colleague
{
    public ConcreteColleagueB(IMediator mediator) : base(mediator) { }

    public override void ReceiveMessage(string message)
    {
        Console.WriteLine("Colleague B received: " + message);
    }

    public override void SendMessage(string message)
    {
        _mediator.SendMessage(message, this);
    }
}

// 具体中介者类
public class ConcreteMediator : IMediator
{
    private ConcreteColleagueA _colleagueA;
    private ConcreteColleagueB _colleagueB;

    public void SetColleagueA(ConcreteColleagueA colleagueA)
    {
        _colleagueA = colleagueA;
    }

    public void SetColleagueB(ConcreteColleagueB colleagueB)
    {
        _colleagueB = colleagueB;
    }

    public void SendMessage(string message, Colleague colleague)
    {
        if (colleague == _colleagueA)
        {
            _colleagueB.ReceiveMessage(message);
        }
        else if (colleague == _colleagueB)
        {
            _colleagueA.ReceiveMessage(message);
        }
    }
}

// 客户端类
public class Client
{
    public void Main()
    {
        ConcreteMediator mediator = new ConcreteMediator();

        ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
        ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);

        mediator.SetColleagueA(colleagueA);
        mediator.SetColleagueB(colleagueB);

        colleagueA.SendMessage("Hello from Colleague A!");
        colleagueB.SendMessage("Hi from Colleague B!");
    }
}

解释

在上述示例中,IMediator是中介者接口,定义了发送消息的方法SendMessage()Colleague是同事类,每个同事类都持有一个对中介者的引用。ConcreteColleagueAConcreteColleagueB是具体的同事类,实现了同事接口,并在自己的消息发送方法中调用中介者的SendMessage()方法。ConcreteMediator是具体的中介者类,负责将消息转发给其他同事。客户端首先创建中介者对象和同事对象,然后通过设置同事的引用到中介者上,实现同事之间的消息交互。

5. 备忘录模式(Memento)

备忘录模式用于保存和恢复对象的状态,并在不破坏封装性的前提下将对象状态的保存和恢复功能委托给其他对象。

示例代码

// 备忘录类
public class Memento
{
    public string State { get; private set; }

    public Memento(string state)
    {
        State = state;
    }
}

// 发起人类
public class Originator
{
    public string State { get; set; }

    public Memento CreateMemento()
    {
        return new Memento(State);
    }

    public void SetMemento(Memento memento)
    {
        State = memento.State;
    }
}

// 管理者类
public class Caretaker
{
    private Memento _memento;

    public void SaveMemento(Memento memento)
    {
        _memento = memento;
    }

    public Memento RetrieveMemento()
    {
        return _memento;
    }
}

// 客户端类
public class Client
{
    public void Main()
    {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        originator.State = "State 1";
        caretaker.SaveMemento(originator.CreateMemento());

        originator.State = "State 2";
        caretaker.SaveMemento(originator.CreateMemento());

        originator.State = "State 3";
        caretaker.SaveMemento(originator.CreateMemento());

        Memento memento = caretaker.RetrieveMemento();
        originator.SetMemento(memento);

        Console.WriteLine(originator.State);  // 输出:State 3
    }
}

解释

在上述示例中,Memento类是备忘录类,用于存储对象的状态;Originator类是发起人类,负责创建备忘录并根据备忘录恢复对象的状态;Caretaker类是管理者类,负责保存和获取备忘录。客户端通过创建发起人、管理者和备忘录对象,并依次设定发起人的状态并将备忘录保存到管理者中,最后可以通过管理者获取备忘录对象并将状态恢复到该备忘录所代表的状态。

6. 观察者模式(Observer)

观察者模式定义了一种一对多的依赖关系,使得当一个对象的状态发生改变时,其依赖对象都会收到通知并自动更新。

示例代码

// 主题接口
public interface ISubject
{
    void Attach(IObserver observer);
    void Detach(IObserver observer);
    void Notify();
}

// 具体主题类
public class ConcreteSubject : ISubject
{
    private List<IObserver> _observers = new List<IObserver>();
    private string _state;

    public string State
    {
        get { return _state; }
        set
        {
            _state = value;
            Notify();
        }
    }

    public void Attach(IObserver observer)
    {
        _observers.Add(observer);
    }

    public void Detach(IObserver observer)
    {
        _observers.Remove(observer);
    }

    public void Notify()
    {
        foreach (IObserver observer in _observers)
        {
            observer.Update();
        }
    }
}

// 观察者接口
public interface IObserver
{
    void Update();
}

// 具体观察者类
public class ConcreteObserver : IObserver
{
    private string _name;
    private ConcreteSubject _subject;

    public ConcreteObserver(string name, ConcreteSubject subject)
    {
        _name = name;
        _subject = subject;
    }

    public void Update()
    {
        Console.WriteLine($"Observer {_name} received state: {_subject.State}");
    }
}

// 客户端类
public class Client
{
    public void Main()
    {
        ConcreteSubject subject = new ConcreteSubject();

        ConcreteObserver observerA = new ConcreteObserver("A", subject);
        ConcreteObserver observerB = new ConcreteObserver("B", subject);

        subject.Attach(observerA);
        subject.Attach(observerB);

        subject.State = "State 1";
        // 输出:
        // Observer A received state: State 1
        // Observer B received state: State 1

        subject.State = "State 2";
        // 输出:
        // Observer A received state: State 2
        // Observer B received state: State 2

        subject.Detach(observerB);

        subject.State = "State 3";
        // 输出:
        // Observer A received state: State 3
    }
}

解释

在上述示例中,ISubject是主题接口,定义了对观察者的操作方法;ConcreteSubject是具体主题类,实现了主题接口,并在状态改变时通知所有观察者。IObserver是观察者接口,定义了观察者的更新方法;ConcreteObserver是具体观察者类,实现了观察者接口,并在收到通知时输出主题的状态。在客户端中,首先创建主题和观察者对象,然后将观察者注册到主题上,最后可以通过改变主题的状态来触发对应观察者的更新。

7. 状态模式(State)

状态模式允许对象在其内部状态发生改变时改变其行为,使得对象看起来像是在修改了其回归类。

示例代码

// 状态接口
public interface IState
{
    void Handle(Context context);
}

// 具体状态类
public class ConcreteStateA : IState
{
    public void Handle(Context context)
    {
        Console.WriteLine("State A handling");
        context.State = new ConcreteStateB();
    }
}

public class ConcreteStateB : IState
{
    public void Handle(Context context)
    {
        Console.WriteLine("State B handling");
        context.State = new ConcreteStateA();
    }
}

// 上下文类
public class Context
{
    public IState State { get; set; }

    public Context(IState initState)
    {
        State = initState;
    }

    public void Request()
    {
        State.Handle(this);
    }
}

// 客户端类
public class Client
{
    public void Main()
    {
        Context context = new Context(new ConcreteStateA());

        context.Request();
        // 输出: State A handling

        context.Request();
        // 输出: State B handling

        context.Request();
        // 输出: State A handling
    }
}

解释

在上述示例中,IState是状态接口,定义了状态的处理方法Handle()ConcreteStateAConcreteStateB是具体状态类,实现了状态接口,并根据自身的逻辑处理状态的改变。Context类是上下文类,内部存储当前的状态,并在请求方法Request()中调用当前状态的处理方法。在客户端中,首先创建上下文对象和初始状态对象,然后可以通过调用上下文的请求方法来触发状态的改变,从而导致不同的行为。

8. 策略模式(Strategy)

策略模式定义了一系列的算法,将每个算法都封装起来,并使它们可以相互替换。

示例代码

// 策略接口
public interface IStrategy
{
    void Execute();
}

// 具体策略类
public class ConcreteStrategyA : IStrategy
{
    public void Execute()
    {
        Console.WriteLine("Executing Strategy A");
    }
}

public class ConcreteStrategyB : IStrategy
{
    public void Execute()
    {
        Console.WriteLine("Executing Strategy B");
    }
}

// 上下文类
public class Context
{
    private IStrategy _strategy;

    public Context(IStrategy strategy)
    {
        _strategy = strategy;
    }

    public void ExecuteStrategy()
    {
        _strategy.Execute();
    }
}

// 客户端类
public class Client
{
    public void Main()
    {
        IStrategy strategyA = new ConcreteStrategyA();
        IStrategy strategyB = new ConcreteStrategyB();

        Context context = new Context(strategyA);
        // 输出: Executing Strategy A
        context.ExecuteStrategy();

        context = new Context(strategyB);
        // 输出: Executing Strategy B
        context.ExecuteStrategy();
    }
}

解释

在上述示例中,IStrategy是策略接口,定义了算法的执行方法Execute()ConcreteStrategyAConcreteStrategyB是具体策略类,分别实现了策略接口,并提供不同的算法实现。Context类是上下文类,持有一个策略对象,并执行策略对象的算法。客户端首先创建不同的策略对象,然后根据需要将不同的策略对象传递给上下文,并调用上下文的执行方法来执行具体的算法。

9. 模板方法模式(Template Method)

模板方法模式定义了一个操作中的算法框架,将一些步骤延迟到子类中实现。

示例代码

// 抽象类
public abstract class AbstractClass
{
    public void TemplateMethod()
    {
        Console.WriteLine("Template Method - Step 1");
        PrimitiveOperation1();
        Console.WriteLine("Template Method - Step 2");
        PrimitiveOperation2();
    }

    protected abstract void PrimitiveOperation1();
    protected abstract void PrimitiveOperation2();
}

// 具体类
public class ConcreteClassA : AbstractClass
{
    protected override void PrimitiveOperation1()
    {
        Console.WriteLine("Concrete Class A - Primitive Operation 1");
    }

    protected override void PrimitiveOperation2()
    {
        Console.WriteLine("Concrete Class A - Primitive Operation 2");
    }
}

public class ConcreteClassB : AbstractClass
{
    protected override void PrimitiveOperation1()
    {
        Console.WriteLine("Concrete Class B - Primitive Operation 1");
    }

    protected override void PrimitiveOperation2()
    {
        Console.WriteLine("Concrete Class B - Primitive Operation 2");
    }
}

// 客户端类
public class Client
{
    public void Main()
    {
        AbstractClass abstractClass = new ConcreteClassA();
        // 输出:
        // Template Method - Step 1
        // Concrete Class A - Primitive Operation 1
        // Template Method - Step 2
        // Concrete Class A - Primitive Operation 2
        abstractClass.TemplateMethod();

        abstractClass = new ConcreteClassB();
        // 输出:
        // Template Method - Step 1
        // Concrete Class B - Primitive Operation 1
        // Template Method - Step 2
        // Concrete Class B - Primitive Operation 2
        abstractClass.TemplateMethod();
    }
}

解释

在上述示例中,AbstractClass是抽象类,定义了模板方法TemplateMethod(),该方法包含了一系列的步骤,并调用了抽象方法PrimitiveOperation1()PrimitiveOperation2()ConcreteClassAConcreteClassB是具体类,继承自抽象类,并实现了抽象方法。客户端中,首先创建具体类的对象,并调用其模板方法,从而按照固定的步骤执行特定的算法。

10. 访问者模式(Visitor)

访问者模式定义了一种在不改变被访问对象结构的前提下,可以对该对象的元素进行操作的方法。

示例代码

// 元素接口
public interface IElement
{
    void Accept(IVisitor visitor);
}

// 具体元素类
public class ConcreteElementA : IElement
{
    public void Accept(IVisitor visitor)
    {
        visitor.VisitConcreteElementA(this);
    }
}

public class ConcreteElementB : IElement
{
    public void Accept(IVisitor visitor)
    {
        visitor.VisitConcreteElementB(this);
    }
}


// 访问者接口
public interface IVisitor
{
    void VisitConcreteElementA(ConcreteElementA element);
    void VisitConcreteElementB(ConcreteElementB element);
}

// 具体访问者类
public class ConcreteVisitor : IVisitor
{
    public void VisitConcreteElementA(ConcreteElementA element)
    {
        Console.WriteLine("Visiting Concrete Element A");
    }
  
    public void VisitConcreteElementB(ConcreteElementB element)
    {
        Console.WriteLine("Visiting Concrete Element B");
    }
}

// 对象结构类
public class ObjectStructure
{
    private List<IElement> _elements = new List<IElement>();

    public void AddElement(IElement element)
    {
        _elements.Add(element);
    }

    public void Accept(IVisitor visitor)
    {
        foreach (IElement element in _elements)
        {
            element.Accept(visitor);
        }
    }
}

// 客户端类
public class Client
{
    public void Main()
    {
        ObjectStructure objectStructure = new ObjectStructure();
        objectStructure.AddElement(new ConcreteElementA());
        objectStructure.AddElement(new ConcreteElementB());

        IVisitor visitor = new ConcreteVisitor();
        objectStructure.Accept(visitor);
        // 输出:
        // Visiting Concrete Element A
        // Visiting Concrete Element B
    }
}

解释

在上述示例中,IElement是元素接口,定义了对元素的访问方法Accept()ConcreteElementAConcreteElementB是具体元素类,实现了元素接口,并在自己的访问方法中调用访问者的具体访问方法。IVisitor是访问者接口,定义了访问者的具体访问方法;ConcreteVisitor是具体访问者类,实现了访问者接口,并在每个具体访问方法中对元素进行访问。ObjectStructure是对象结构类,包含了需要被访问的元素,并提供对外的访问方法。在客户端中,首先创建对象结构对象和具体元素对象,并将元素对象加入到对象结构中,然后通过创建具体访问者对象来访问对象结构中的元素。


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1258494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用elementPlus去除下拉框蓝色边框

// 下拉框去除蓝色边框 .el-select {--el-select-input-focus-border-color: none !important; }

每日一练2023.11.26——打印沙漏【PTA】

题目要求&#xff1a; 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”&#xff0c;要求按下列格式打印 ************ *****所谓“沙漏形状”&#xff0c;是指每行输出奇数个符号&#xff1b;各行符号中心对齐&#xff1b;相邻两行符号数差2&#xff1b;…

从青铜到王者,小白也能写出高级自动化代码

写代码就像建房子&#xff0c;一砖一瓦大家都知道&#xff0c;难点是在你如何盖的更高级。对于写代码来说&#xff0c;基础语法无非就那几个&#xff0c;很多人都会&#xff0c;关键是如何将代码写得健壮、写得条理清楚。 在学习自动化开发语言过程中&#xff0c;很多人都会有…

ThinkPHP6学生选课管理系统

有需要请加文章底部Q哦 可远程调试 ThinkPHP6学生选课管理系统 一 介绍 此学生选课管理系统基于ThinkPHP6框架开发&#xff0c;数据库mysql8&#xff0c;前端bootstrap。系统角色分为学生&#xff0c;教师和管理员。学生登录后可进行选课&#xff0c;教师登录后可查看选课情况…

「直播预告」替代 Oracle,我们还有多长的路要走?

数字经济浪潮席卷全球&#xff0c;我国数字经济也进入快速发展阶段&#xff0c;作为数字化重要载体&#xff0c;国产软件的重要性不言而喻。近年来&#xff0c;国际局势复杂多变&#xff0c;在客观要求和主观需求的双重驱动下&#xff0c;核心技术自主可控的紧迫性也愈加凸显。…

Gradle更新失败(Error:Connection timed out: connect...)解决方法

一. 发现问题 当我们Copy一个项目或者在不同的机器打开AndroidStudio项目时&#xff0c;可能会遇到这样的问题&#xff1a;Gradle一直在转啊转&#xff0c;然后报错 Error:Connection timed out: connect. If you are behind an HTTP proxy, please configure the proxy setti…

顺序表总结

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 目录 &#x1f324;️arraylist的简…

【图像分类】基于深度学习的中草药分类系统的设计与实现(ResNet网络,附代码和数据集)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。(专栏订阅用户订阅专栏后免费提供数据集和源码一份,超级VIP用户不在服务范围之内,不想订阅专栏的兄弟们可以私信…

如何在安卓Termux中使用SFTP文件传输并结合内网穿透工具实现远程传输

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

跨境电商与物联网:智能设备的未来

随着科技的不断发展&#xff0c;跨境电商和物联网的结合呈现出前所未有的新格局。在这个数字化的时代&#xff0c;智能设备正成为跨境电商的新宠&#xff0c;为商业、物流和消费者带来了全新的体验。本文将深入探讨跨境电商与物联网的结合&#xff0c;探讨智能设备在未来的发展…

为什么你的团队不需要使用拉取请求 | IDCF

作者&#xff1a;Kief Morris 译者&#xff1a;冬哥 原文&#xff1a;https://infrastructure-as-code.com/book/2021/01/02/pull-requests.html 前 言 Github 引入了Pull Request拉取请求&#xff08;简称PR&#xff09;实践和相关的支持功能&#xff0c;使运行开源项目的人…

Day58权限提升-网站权限后台漏洞第三方获取

webshell 一般我们的渗透流程就是信息收集&#xff0c;发现漏洞&#xff0c;漏洞利用&#xff0c;一些漏洞成功之后获得一些相应的权限&#xff0c;还有一些是漏洞利用成功之后并没有取得的权限&#xff0c;而这个权限是要通过漏洞利用之后在利用其它地方取货的权限。 权限的获…

docker (简介、dcoker详细安装步骤、常用命令)- day01

一、 为什么出现 Docker是基于Go语言实现的云开源项目。 Docker的主要目标是“Build&#xff0c;Ship and Run Any App,Anywhere”&#xff0c;也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理&#xff0c;使用户的APP&#xff08;可以是一个WEB应用或数据库应…

8 个适用于电脑的顶级免费分区恢复软件

Windows PC 上的数据管理有时可能会带来压力&#xff0c;尤其是当您有多个分区时。大多数时候&#xff0c;磁盘管理工具使分析磁盘、释放空间甚至创建分区变得非常容易。但有时会发生不可预见的事件&#xff0c;可能导致分区丢失&#xff0c;从而造成潜在的数据灾难。嗯&#x…

Keil报错_Error:CreateProcess failed,Command:‘xxx\fromelf.exe‘

1、报错信息 2、分析及解决 错误原因&#xff1a;fromelf.exe路径错误&#xff0c;无法执行命令。 发生情景&#xff1a;编译从另一个电脑拷贝的代码时。 解决方法&#xff1a; 1、当你不需要生成bin文件时&#xff0c;可以选择不执行这个命令。&#xff08;去掉√&#xf…

Java 之 lambda 表达式(一)

目录 一. 前言 二. lambda 表达式语法 2.1. 语法1&#xff1a;无参&#xff0c;无返回值 2.2. 语法2&#xff1a;一个参数&#xff0c;无返回值 2.3. 语法3&#xff1a;两个参数&#xff0c;lambda 体中有多条语句 2.4. 语法4&#xff1a;两个以上参数&#xff0c;有返回…

使用paddledetection的记录

首先在这里使用的是是paddle--detection2.7的版本。 成功进行训练 目录&#xff1a; 目录 数据集准备 配置文件的修改 使用的是BML的平台工具&#xff1a; !python -m pip install paddlepaddle-gpu2.5 -i https://mirror.baidu.com/pypi/simple --user %cd /home/aistudio…

识别验证码

背景 需求是要爬取某网站的数据, 已有账号密码, 但这个网站需要登录, 登录需要输入验证码 验证码样式如下 调研了Tesseract框架, 识别效果不佳. 后来使用ddddocr, 能正确识别. https://github.com/sml2h3/ddddocr 代码如下 def ocr():response requests.get(http://xxx/get…

Jenkins Pipeline应用实践

Jenkins Pipeline是一种可编程的、可扩展的持续交付管道&#xff0c;允许您使用脚本来定义整个软件交付过程。 以下是使用Jenkins Pipeline创建和配置流水线的基本步骤。 Part 01. 创建一个Pipeline Job 在Jenkins中创建一个新的"Pipeline"类型的Job。 以下是在Je…

【STM32F103】HC-SR04超声波测距模块详解(附工程文件)

前言&#xff1a; 使用的硬件&#xff1a;STM32F103C8T6&#xff0c;HC-SR04&#xff0c;ST-Link&#xff08;其他烧录器也可以&#xff09;&#xff0c;0.96寸OLED屏幕&#xff08;非必须&#xff0c;仅供显示测距结果&#xff0c;可以使用串口助手代替&#xff09;&#xff…