小滴课堂-学习笔记:(9) 关注对象之间的通信-行为型模式应用《下》

完美解决android 8.0 以上 开启Service异常 完美视频android 8.0以上开启Service: IllegalStateException: Not allowed to start service Intent ...异常 简要: android 8.0应用处于后台运行时,不允许startService方式开启服务,否则抛出异常 IllegalStateException: Not allowed to start service Intent ... android 8.0应用在后台运行大于1min时,会默认杀死后台服务... 阅读详情

logo 愿景:"让编程不再难学,让技术与生活更加有趣"


更多架构课程请访问 xdclass.net

 

目录

第1集 责任链设计模式介绍和应用场景

第2集 责任链设计模式案例实战-老王设计的反作弊系统的风控级别

第3集 Command Pattern命令设计模式介绍和应用场景

第4集 命令设计模式之智能家居控制案例实战

第5集 IteratorPattern迭代器设计模式介绍和应用场景

第6集 迭代器模式案例实战之自定义List集合容器

干货文档


第1集 责任链设计模式介绍和应用场景

简介:责任链设计模式介绍和应用场景

  • 责任链设计模式(Chain of Responsibility Pattern)

    • 客户端发出一个请求,链上的对象都有机会来处理这一请求,而客户端不需要知道谁是具体的处理对象
    • 让多个对象都有机会处理请求,避免请求的发送者和接收者之间的耦合关系,将这个对象连成一条调用链,并沿着这条链传递该请求,直到有一个对象处理它才终止
    • 有两个核心行为:一是处理请求,二是将请求传递到下一节点

 

  • 应用场景

    • Apache Tomcat 对 Encoding 编码处理的处理,SpringBoot里面的拦截器、过滤器链
    • 在请求处理者不明确的情况下向多个对象中的一个提交请求
    • 如果有多个对象可以处理同一个请求,但是具体由哪个对象处理是由运行时刻动态决定的,这种对象就可以使用职责链模式

 

  • 角色

    • Handler抽象处理者:定义了一个处理请求的接口
    • ConcreteHandler具体处理者: 处理所负责的请求,可访问它的后续节点,如果可处理该请求就处理,否则就将该请求转发给它的后续节点

image-20201011170107379

 

 

 

 

 

 

 

 

 

第2集 责任链设计模式案例实战-老王设计的反作弊系统的风控级别

简介:责任链设计模式案例实战

  • 业务需求
 

 

 
风控规则,就是对于每个场景,定义一些规则,来进行相应的控制,比如银行借款、支付宝提现、大额转账等 会触发不同的策略。
​
像互联网金融行业的话,除了公司内部政策,所处的外部环境经常发生变化,比如国家经常会出政策,这些都经常需要调整相应的风控参数和风控级别。
​
例子:支付宝转账,根据转账额度不同,会触发的风控级别不一样,1000元以下直接转,1千到1万需要手机号验证码,1万到以上需要刷脸验证。

image-20201011170011367

  • 编码实战
 


public class Request {
    /**
     * 类别
     */
    private String requestType;
​
    /**
     * 金额
     */
    private int money;
  
  //set get方法省略
}
​
public enum RequestType {
    /**
     * 转账
     */
    TRANSFER,
​
    /**
     * 提现
     */
    CASH_OUT;
}
​
/**
 * 小滴课堂,愿景:让技术不再难学  https://xdclass.net
 *
 * @Description 风控级别抽象类
 * @Author 二当家小D
 * @Remark 有问题直接联系我,源码-笔记-技术交流群 微信 xdclass6
 * @Version 1.0
 **/
public abstract class RiskControlManager {
    protected  String name;
​
    /**
     * 更严格的风控策略
     */
    protected RiskControlManager superior;
​
    public RiskControlManager(String name){
        this.name = name;
    }
    /**
     * 设置更严格的风控策略
     * @param superior
     */
    public void setSuperior(RiskControlManager superior){
        this.superior = superior;
    }
    /**
     * 处理请求
     * @param request
     */
    public abstract void handlerRequest(Request request);
}
​
/**
 * 小滴课堂,愿景:让技术不再难学  https://xdclass.net
 *
 * @Description 风控级别抽象类
 * @Author 二当家小D
 * @Remark 有问题直接联系我,源码-笔记-技术交流群 微信 xdclass6
 * @Version 1.0
 **/
public class FirstRiskControlManager extends RiskControlManager {
​
    public FirstRiskControlManager(String name) {
        super(name);
    }
​
    /**
     *  1000元以内可以直接处理
     * @param request
     */
    @Override
    public void handlerRequest(Request request) {
​
        if(RequestType.valueOf(request.getRequestType())!=null && request.getMoney()<=1000){
​
            System.out.println("普通操作,输入支付密码即可");
​
            System.out.println(name+":"+request.getRequestType() + ", 金额:"+request.getMoney() +" 处理完成");
​
        }else {
​
            //下个节点进行处理
            if(superior!=null){
                superior.handlerRequest(request);
            }
        }
​
    }
}
​
public class SecondRiskControlManager extends RiskControlManager {
​
    public SecondRiskControlManager(String name) {
        super(name);
    }
​
    /**
     * 处理 1千到1万之间
     * @param request
     */
    @Override
    public void handlerRequest(Request request) {
        if(RequestType.valueOf(request.getRequestType())!=null && request.getMoney()>1000 && request.getMoney()<10000){
​
            System.out.println("稍大额操作,输入支付密码+短信验证码即可");
​
            System.out.println(name+":"+request.getRequestType() + ", 金额:"+request.getMoney() +" 处理完成");
​
        }else {
​
            //下个节点进行处理
            if(superior!=null){
                superior.handlerRequest(request);
            }
        }
    }
}
​
public class ThirdRiskControlManager extends RiskControlManager {
​
    public ThirdRiskControlManager(String name) {
        super(name);
    }
​
    @Override
    public void handlerRequest(Request request) {
        if(RequestType.valueOf(request.getRequestType())!=null && request.getMoney()>10000){
​
            System.out.println("大额操作,输入支付密码+验证码+人脸识别 ");
​
            System.out.println(name+":"+request.getRequestType() + ", 金额:"+request.getMoney() +" 处理完成");
​
        }else {
            //下个节点进行处理
            if(superior!=null){
                superior.handlerRequest(request);
            }
        }
    }
}
​
//使用
public static void main(String[] args) {
​
        RiskControlManager firstControlManager = new FirstRiskControlManager("初级风控");
​
        RiskControlManager secondControlManager = new SecondRiskControlManager("中级风控");
​
        RiskControlManager thirdControlManager = new ThirdRiskControlManager("高级风控");
​
        //形成调用链
        firstControlManager.setSuperior(secondControlManager);
        secondControlManager.setSuperior(thirdControlManager);
​
​
        //使用
        Request request1 = new Request();
        request1.setRequestType(RequestType.CASH_OUT.name());
        request1.setMoney(20000);
        firstControlManager.handlerRequest(request1);
​
​
    }
  • 优点

    • 客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者 降低了耦合度
    • 通过改变链内的调动它们的次序,允许动态地新增或者删除处理类,比较很方便维护
    • 增强了系统的可扩展性,可以根据需要增加新的请求处理类,满足开闭原则
    • 每个类只需要处理自己该处理的工作,明确各类的责任范围,满足单一职责原则

 

  • 缺点

    • 处理都分散到了单独的职责对象中,每个对象功能单一,要把整个流程处理完,需要很多的职责对象,会产生大量的细粒度职责对象
    • 不能保证请求一定被接收;
    • 如果链路比较长,系统性能将受到一定影响,而且在进行代码调试时不太方便

 

  • 日志处理级别

    • dubug->info->warning->error

 

 

 

 

 

 

 

第3集 Command Pattern命令设计模式介绍和应用场景

简介:命令设计模式介绍和应用场景

  • 命令设计模式(Command Pattern)

    • 请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的对象,并把该命令传给相应的对象 执行命令,属于行为型模式
    • 命令模式是一种特殊的策略模式,体现的是多个策略执行的问题,而不是选择的问题

 

  • 应用场景

    • 只要是你认为是命令的地方,就可以采用命令模式

    • 日常每个界面、按钮、键盘 事件操作都是 命令设计模式

       

 

  • 角色

    • 抽象命令(Command):需要执行的所有命令都在这里声明
    • 具体命令(ConcreteCommand):定义一个接收者和行为之间的弱耦合,实现execute()方法,负责调用接收者的相应操作,execute()方法通常叫做执行方法。

     

    • 接受者(Receiver):负责具体实施和执行一个请求,干活的角色,命令传递到这里是应该被执行的,实施和执行请求的方法叫做行动方法

     

    • 请求者(Invoker):负责调用命令对象执行请求,相关的方法叫做行动方法

    • 客户端(Client):创建一个具体命令(ConcreteCommand)对象并确定其接收者。

       

image-20201011220112296

 

 


//接受者,命令执行者
public class Receiver {
    public void doSomething() {
        System.out.println("Receiver---doSomething");
    }
}
​
​
//抽象命令
public interface Command {
​
    /**
     * 执行动作
     */
    void execute();
}
​
//具体命令
public class ConcreteCommand implements Command {
    /**
     * 对哪个receiver类进行命令处理
     */
    private Receiver receiver;
​
    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }
​
    /**
     * 必须实现一个命令
     */
    @Override
    public void execute() {
        System.out.println("ConcreteCommand---execute");
        receiver.doSomething();
    }
​
}
​
//请求者
public class Invoker {
​
    private Command command;
​
    public Invoker(Command command){
​
        this.command = command;
    }
​
    /**
     * 执行命令
     */
    public void action(){
        this.command.execute();
    }
}
​
​
//使用
public static void main(String[] args) {
        //创建接收者
        Receiver receiver = new Receiver();
        //创建命令对象,设定它的接收者
        Command command = new ConcreteCommand(receiver);
​
      //创建请求者,把命令对象设置进去
        Invoker invoker = new Invoker(command);
        //执行方法
        invoker.action();
​
    }








 

 

第4集 命令设计模式之智能家居控制案例实战

简介:命令设计模式案例实战

  • 业务需求
 

 

 
小滴课堂老王-搬新家了,他想实现智能家居,开发一个app,可以控制家里的家电,比如控制空调的开关、加热、制冷 等功能
​
利用命令设计模式,帮老王完成这个需求,注意:动作请求者就是手机app, 动作的执行者是家电的不同功能
  • 编码





/**
 * 小滴课堂,愿景:让技术不再难学  https://xdclass.net
 *
 * @Description 命令执行者
 * @Author 二当家小D
 * @Remark 有问题直接联系我,源码-笔记-技术交流群 微信 xdclass6
 * @Version 1.0
 **/
public class ConditionReceiver {
​
    public void on(){
        System.out.println("空调开启了");
    }
​
    public void off(){
        System.out.println("空调关闭了");
    }
​
    public void cool(){
        System.out.println("空调开始制冷");
    }
​
    public void warm(){
        System.out.println("空调开始制暖");
    }
}
​
​
public interface Command {
​
    /**
     * 执行动作
     */
    void execute();
​
}
​
/**
 * 小滴课堂,愿景:让技术不再难学  https://xdclass.net
 *
 * @Description 具体命令
 * @Author 二当家小D
 * @Remark 有问题直接联系我,源码-笔记-技术交流群 微信 xdclass6
 * @Version 1.0
 **/
public class OnCommand implements Command{
​
    /**
     * 对哪个receiver 进行命令处理
     */
    private ConditionReceiver receiver;
​
    public OnCommand(ConditionReceiver receiver){
        this.receiver = receiver;
    }
​
    /**
     * 必须实现一个命令的调用
     */
    @Override
    public void execute() {
​
        System.out.println("OnCommand -> execute");
        receiver.on();
​
    }
}
​
public class OffCommand implements Command{
​
    /**
     * 对哪个receiver 进行命令处理
     */
    private ConditionReceiver receiver;
​
    public OffCommand(ConditionReceiver receiver){
        this.receiver = receiver;
    }
​
    /**
     * 必须实现一个命令的调用
     */
    @Override
    public void execute() {
​
        System.out.println("OffCommand -> execute");
        receiver.off();
​
    }
}
​
public class CoolCommand implements Command{
​
    /**
     * 对哪个receiver 进行命令处理
     */
    private ConditionReceiver receiver;
​
    public CoolCommand(ConditionReceiver receiver){
        this.receiver = receiver;
    }
​
    /**
     * 必须实现一个命令的调用
     */
    @Override
    public void execute() {
​
        System.out.println("CoolCommand -> execute");
        receiver.cool();
​
    }
}
​
/**
 * 小滴课堂,愿景:让技术不再难学  https://xdclass.net
 *
 * @Description 请求者
 * @Author 二当家小D
 * @Remark 有问题直接联系我,源码-笔记-技术交流群 微信 xdclass6
 * @Version 1.0
 **/
public class AppInvoker {
​
​
    private Command onCommand;
    private Command offCommand;
​
    private Command coolCommand;
    private Command warmCommand;
​
​
    public void setOnCommand(Command onCommand) {
        this.onCommand = onCommand;
    }
​
    public void setOffCommand(Command offCommand) {
        this.offCommand = offCommand;
    }
​
    public void setCoolCommand(Command coolCommand) {
        this.coolCommand = coolCommand;
    }
​
    public void setWarmCommand(Command warmCommand) {
        this.warmCommand = warmCommand;
    }
​
​
    /**
     * 开机
     */
    public void on(){
        onCommand.execute();
    }
​
    /**
     * 关机
     */
    public void off(){
        offCommand.execute();
    }
​
    public void warm(){
        warmCommand.execute();
    }
​
    public void cool(){
        coolCommand.execute();
    }
​
}
​
//使用
 public static void main(String[] args) {
​
        //创建接受者,空调就是接受者
        ConditionReceiver receiver = new ConditionReceiver();
​
        //创建命令对象,设置命令的接受者
        Command onCommand = new OnCommand(receiver);
        Command offCommand = new OffCommand(receiver);
        Command coolCommand = new CoolCommand(receiver);
        Command warmCommand = new WarmCommand(receiver);
​
        //创建请求者,把命令对象设置进去,app就是请求发起者
        AppInvoker appInvoker = new AppInvoker();
        appInvoker.setOnCommand(onCommand);
        appInvoker.setOffCommand(offCommand);
        appInvoker.setCoolCommand(coolCommand);
        appInvoker.setWarmCommand(warmCommand);
​
        appInvoker.on();
        System.out.println();
​
        appInvoker.cool();
        System.out.println();
​
        appInvoker.warm();
        System.out.println();
        
        appInvoker.off();
​
    }
  • 优点

    • 调用者角色与接收者角色之间没有任何依赖关系,不需要了解到底是哪个接收者执行,降低了系统耦合度
    • 扩展性强,新的命令可以很容易添加到系统中去。

 

  • 缺点

    • 过多的命令模式会导致某些系统有过多的具体命令类

image-20201012120838097

 

 

 

 

 

第5集 IteratorPattern迭代器设计模式介绍和应用场景

简介:迭代器设计模式介绍和应用场景

  • 迭代器设计模式(Iterator Pattern)

    • 提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部实现,属于行为型模式
    • 应该是java中应用最多的设计模式之一
    提到迭代器,想到它是与集合相关的,集合也叫容器,可以将集合看成是一个可以包容对象的容器,例如List,Set,Map,甚至数组都可以叫做集合,迭代器的作用就是把容器中的对象一个一个地遍历出来

     

  • 应用场景

    • 一般来说,迭代器模式是与集合是共存的,只要实现一个集合,就需要同时提供这个集合的迭代器,就像java中的Collection,List、Set、Map等 都有自己的迭代器
    • JAVA 中的 iterator迭代器

 

  • 角色

    • 抽象容器(Aggregate):提供创建具体迭代器角色的接口,一般是接口,包括一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。
    • 具体容器角色(ConcreteAggregate):实现抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkedList, Set接口的哈希列表的实现HashSet等。
    • 抽象迭代器角色(Iterator):负责定义访问和遍历元素的接口,包括几个核心方法,取得下一个元素的方法next(),判断是否遍历结束的方法isDone()(或者叫hasNext()),移除当前对象的方法remove()
    • 具体迭代器角色(ConcreteIterator):实现迭代器接口中定义的方法,并要记录遍历中的当前位置,完成集合的迭代

image-20201012184722191

 

 

 

 

 

第6集 迭代器模式案例实战之自定义List集合容器

简介:迭代器设计模式案例实战

  • 案例需求
 

 

 
自定义一个集合容器,并实现里面的迭代器功能,List集合容器的简化版本

image-20201012220042206

  • 编码实战
 


/**
 * 小滴课堂,愿景:让技术不再难学
 *
 * @Description 抽象迭代器
 * @Author 二当家小D
 * @Remark 有问题直接联系我,源码-笔记-技术交流群
 * @Version 1.0
 **/
​
public interface Iterator {
​
    /**
     * 获取下个元素
     * @return
     */
    Object next();
​
    /**
     * 是否有下一个
     * @return
     */
    boolean hasNext();
    /**
     * 删除元素
     * @param obj
     * @return
     */
    Object remove(Object obj);
​
}
​
​
/**
 * 小滴课堂,愿景:让技术不再难学
 *
 * @Description 具体的迭代器
 * @Author 二当家小D
 * @Remark 有问题直接联系我,源码-笔记-技术交流群
 * @Version 1.0
 **/
​
public class ConcreteIterator implements Iterator {
​
    private List list;
​
    private int index = 0;
​
    public ConcreteIterator(List list){
        this.list = list;
    }
​
​
    @Override
    public Object next() {
​
        Object obj = null;
        if(this.hasNext()){
            obj = this.list.get(index);
            index++;
        }
        return obj;
    }
​
    @Override
    public boolean hasNext() {
        if(index == list.size()){
            return false;
        }
        return true;
    }
​
    @Override
    public Object remove(Object obj) {
        return list.remove(obj);
    }
}
​
​
/**
 * 小滴课堂,愿景:让技术不再难学
 *
 * @Description 抽象容器建立了
 * @Author 二当家小D
 * @Remark 有问题直接联系我,源码-笔记-技术交流群
 * @Version 1.0
 **/
​
public interface ICollection {
​
    void add(Object obj);
​
    void remove(Object obj);
​
    Iterator iterator();
}
​
/**
 * 小滴课堂,愿景:让技术不再难学
 *
 * @Description  容器简化版
 * @Author 二当家小D
 * @Remark 有问题直接联系我,源码-笔记-技术交流群
 * @Version 1.0
 **/
​
public class MyCollection implements ICollection {
​
    private List list  = new ArrayList();
​
    @Override
    public void add(Object obj) {
        list.add(obj);
    }
​
    @Override
    public void remove(Object obj) {
​
        list.remove(obj);
    }
​
    @Override
    public Iterator iterator() {
        return new ConcreteIterator(list);
    }
}
​
//使用
public static void main(String[] args) {
​
        ICollection collection = new MyCollection();
        collection.add("小滴课堂老王");
        collection.add("小滴课堂Anna小姐姐");
        collection.add("小滴课堂二当家小D");
        collection.add("小滴课堂刘一手");
        collection.add("小滴课堂老帆");
​
        Iterator iterator = collection.iterator();
​
        while (iterator.hasNext()){
            Object obj = iterator.next();
            System.out.println(obj);
        }
    }
  • 优点

    • 可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据

    • 支持以不同的方式遍历一个聚合对象

       

  • 缺点

    • 对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐
    • 迭代器模式在遍历的同时更改迭代器所在的集合结构会导致出现异常

 

  • JDK源码 ArrayList的迭代器例子

image-20201012184653205

 

 

干货文档

App渠道追踪实战指南:iOS、Android与鸿蒙多平台实现与避坑 在移动应用增长领域,用户获取渠道的效果评估是数据驱动决策的核心。其技术原理主要围绕归因逻辑展开,即通过标识符的生成、传递与匹配,将用户安装行为准确关联到特定的推广来源。这项技术的核心价值在于实现营销预算的精准分配与ROI优化,是增长团队进行渠道效果评估、用户质量分析和LTV预测的基础。在实际应用场景中,开发者需要针对iOS、Android及新兴的鸿蒙(HarmonyOS)等多平台生态,设计并实施稳定可靠的追踪方案。本文聚焦于**渠道追踪**与**归因平台**等关键技术点,深入解析多平台下的实现路径、混合方案 阅读详情

相关推荐

RAG——RAG 索引(文档解析技术)

本文介绍了RAG系统中文档解析的关键技术,重点分析了如何通过LangChain的Document Loaders处理多种格式文档。文章指出高质量文档解析对RAG系统效果的决定性作用,并详细讲解了PDF、TXT、Word等常见格式的解析方法。作者提供了代码示例和Gitee开源项目链接,特别强调了PDF解析的深入方案,同时介绍了相关依赖库的安装配置。文章还展示了如何定义通用文档加载方法,为开发者提供了实用的技术参考。

小志的博客 751

设计模式考前预习—14_备忘录模式

代码无错未必优 备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。 要保存的细节给封装在了memento中了,哪一天要更改保存的细节也不用影响客户端。memento模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只能是众多属性中的一小部分时,originator可以根据保存的么能头条信息还原到前一状态。如果在某一个系统中使用命令模式时,需要实现命令的撤销功能,那么命令模式就可以使用备忘录模式来存储

qq_43627886的博客 211

Matlab实战:水声信号DEMON谱分析从入门到精通(附完整源码)

本文详细介绍了使用Matlab进行水声信号DEMON谱分析的完整流程,从基础理论到实战应用,涵盖信号预处理、包络提取、频谱分析等关键步骤,并附完整源码。特别针对水声通信中的低信噪比环境,提供了多种优化方案和性能提升技巧,帮助读者快速掌握这一水下目标检测的核心技术。

gamma的博客 295

基于uniapp+vue3+ts小程序项目实战之项目初始化

uniapp+vue3+ts+vite+unocss小程序项目实战

二当家小D的学习资源库 1090

用MATLAB从零实现六足机器人步态仿真:交替三角与波动步态保姆级教程

本文详细介绍了如何使用MATLAB从零实现六足机器人的两种经典步态仿真:交替三角支撑步态和波动步态。通过参数定义、相位设置、运动轨迹生成和三维可视化等步骤,帮助读者掌握六足机器人步态规划的核心技术。教程包含完整代码和详细解析,适合机器人爱好者和相关专业学生学习实践。

weixin_26765363的博客 226

蓝桥杯嵌入式(基础教程)STM32G431RBT6——创建工程以及点灯

首先选择正确的芯片类型:STM32G431RBT6工程的创建主要有配置时钟以及烧录的方式。在配置好之后需要对时钟进行配置,由于蓝桥杯的外部晶振是24MHz因此需要对时钟树进行相应的配置。第一步先点击时钟配置之后就可以对时钟进行相应的配置了最后一步,需要对工程起一个名字,并且要选择KEIL做为其相应的软件之后再需要再生成代码那里进行相应的控制。当然这样根据生成的工程不能直接使用会有一个报错,所以需要添加一个启动文件。这个启动文件可以在官方的LCD文件夹下复制到自己的工程中。

m0_74051113的博客 1093

android back键后的输入法的流程分析

这里我其实主要讲

沈纵情 2680

802.11ax 的OFDMA资源分配详解

802.11ax 引入的最重要的技术就是OFDMA。OFDMA中引入了RU(资源块)概念,也就是20Mhz/40Mhz/80Mhz/160Mhz的带宽可以切割成不同尺寸的RU,分配给不同的用户使用,这样就大大提高了频谱资源的利用率。 常见的RU尺寸有26/52/102/242/484/996,单位是子载波,每个子载波是78.125Khz,这样20Mhz的带宽可以划分为如下图所示的不同RU大小。 按照11ax规范的要求,上下行的数据传输都可以由AP来统一调度,这样上下行的OFDM...

weixin_43408952的博客 1万+

对象间的交互——消息

对象之间通过消息进行交互。在UML中,消息表示为交互图中的箭头线。箭头线的类型代表消息的类型消息的分类:        1、简单消息:只表示控制从一个对象传递给另一个对象,而没有描述消息的细节。简单消息用在对消息的细节未知或不需要考虑通信细节的场合。图示如下:                                                2、同步消息:发送消息的对象在恢

西狂 3644

嵌入式软件面试常见问题及答案

干了多年的嵌入式,被面试过,也面过不少新人,下面这些是面试中很常见的一些问题及答案,答案可以根据自己的经验自己思考下。--持续补充并更新

weixin_37553721的博客 6022

Mamba SSM 实战:IMDb 文本分类 + Mamba-ssm 全流程

Mamba SSM 文本分类链路:IMDb 二分类 → MambaLMHeadModel (d_model=256, n_layer=8, d_state=16, exp2=2) → 末 token 分类头。5 epoch 达 89.2% 准确率 (与 BERT-base 持平), 但显存降低 44% (3.5GB vs 6.2GB)。建议序列长度 ≥ 1024 再选 Mamba, 短序列 (< 512) 用 BERT 更高效。扩展时注意d_state。

m0_71589036的博客 57

小滴课堂-学习笔记:(8)关注对象之间的通信-行为型模式应用《上》

愿景:"让编程不再难学,让技术与生活更加有趣" 更多架构课程请访问 xdclass.net 目录 第1集 三十六计-玩转策略模式和应用场景 第2集 策略设计模式实战之电商多场景促销活动方案 第3集 大象装进冰箱分几步?模板方法设计模式介绍 第4集 项目里程碑把控案例-模板方法设计模式案例实战 第5集 经典中的经典-Observer观察者设计模式介绍和应用 第6集 老王上班摸鱼-Observer观察者设计模式案例实战 干货文档 第1集 三十六计-玩转策略模式和应用场景 简介:策略设计模.

dev666的博客 303

QNX侧触摸屏(TP)Bringup流程与源码深度解析

QNX侧TP Bringup的核心在于构建。

QQ_778132974的博客 477

小滴课堂-学习笔记:(10)关注对象之间的通信-行为型模式 终极篇

愿景:"让编程不再难学,让技术与生活更加有趣" 更多架构课程请访问 xdclass.net 目录 第1集 备忘录设计模式介绍和应用场景 第2集 备忘录设计模式实战之游戏存档恢复 第3集 状态设计模式介绍和应用场景 第4集 状态设计模式案例实战之电商系统订单状态处理 第5集 不常用的设计模式和学习建议 干货文档 第1集 备忘录设计模式介绍和应用场景 简介:备忘录设计模式介绍和应用场景 备忘录设计模式(Memento Pattern) 在不破坏封闭的前提下,捕获一个对象的内..

dev666的博客 321

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

小滴课堂-学习笔记:(2)想成为架构师的你,不可不知道的设计模式精髓

愿景:"让编程不再难学,让技术与生活更加有趣" 更多架构课程请访问 xdclass.net 目录 第1集 设计模式的六大原则你知道多少 第2集 大佬们常说的设计模式到底是什么 第3集 多个业务场景浏览-设计模式使用前后的区别 干货文档 第1集 设计模式的六大原则你知道多少 简介:讲解设计模式的六大设计原则 设计模式是站在设计原则的基础之上的,所以在学习设计模式之前,有必要对这些设计原则先做一下了解 软件设计开发原则 为了让的代码更好重用性,可读性,可靠性,可维护性..

dev666的博客 272

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

必备redis6教程-分布式缓存Redis6.X+高可用集群课程介绍-小滴课堂

第二章 高并发必备技术+新版分布式缓存Redis6安装 第1集 高并发的必备两大“核技术”队列和缓存 简介:高并发的必备两大“核技术”队列和缓存介绍 什么是队列(MQ消息中间件) 全称MessageQueue,主要是用于程序和程序直接通信,异步+解耦 使用场景: 核心应用 解耦:订单系统-》物流系统 异步:用户注册-》发送邮件,初始化信息 削峰:秒杀、日志处理 什么是缓存 程序经常要...

XDCLASS21的博客 285

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

全方位认识redis

学习视频已在个人公众号连载 01 课程介绍 本套课程 是2021年全新录制,从0到1讲解分布式缓存Redis6.x,多种核心数据结构,零基础掌握Redis6.X核心基础+高级知识点。 不止讲解Redis核心数据结构,超多案例实战:图形验证码/商品热点数据/日销榜单/电商购物车/用户画像/社交应用/积分实时榜单/多场景分页缓存等,还整合当下新版热门框架SpringBoot2.X+SpringCache框架实战 02 为什么要学习分布式缓存Redis6.X 多数互联网公司里面用的技术栈,高并发项目都离不

m0_37908583的博客 298

设计模式-中介者Mediator深思(对象/模块/进程通信)

本文参考了大话设计模式( 次)、GOF设计模式(主)书中,对象行为模式-中介者模式的相关知识点,结合项目使用经验,谈了些使用心得。主要总结了中介者模式的巨大优势,针对其“解耦对象间直接连接”这一功能,横向对比了回调函数方案、客户端连接方案。重点关注对象间通信、模块间通信。还进行了一些不太靠谱的想用它构建简单软总线的联想..

Dahe.qu 362

责任链模式

责任链模式

独行者103的专栏 339

小滴课堂-学习笔记:小滴课堂面试专题介绍+简历分析+投递

愿景:"让编程不再难学,让技术与生活更加有趣" 更多架构课程请访问 xdclass.net 目录 第1集 小滴课堂面试专题课程介绍+适合人员+学后水平 第2集 小滴课堂面试专题第一季大纲速览,你知道多少 第3集 互联网公司校/社招的招聘要求解读 第4集 学历/部分招聘条件不符合? 互联网公司简历投递技巧 第5集 BAT大厂社招、校招、内推常见的面试形式有多少 第6集 拿到面试通知,怎样应对互联网公司的多轮面试 第7集 社招+校招被技术面试完虐系列之多方位考查点 干货文档 第1集 小滴.

dev666的博客 2399

小滴课堂-学习笔记:(1)JAVASE课程

愿景:"让编程不再难学,让技术与生活更加有趣" 更多架构课程请访问 xdclass.net 目录 第1集 茫茫人海中为何选择java这门语言 第2集 速成系列java从入门到告诉高手课程介绍 第3集 Java语言编程发展历程和JVM概述 第4集 概念理解面向对象编程和特点 第二章 Java开发环境准备和基础语法第一季 第2集 新版Java环境变量配置 第3集 完成你的第一个Java程序Hello World 第4集 Hello World程序剖析Java语法 第三章 集成开发环..

dev666的博客 2015

小滴课堂-学习笔记:(7)提效神器之代码自动生成MybatisPlus-Generator+Lombok

愿景:"让编程不再难学,让技术与生活更加有趣" 更多架构课程请访问 xdclass.net 目录 第1集 项目引入Mybatis-plus-generator代码自动生成工具 第2集 自动化生成代码-加入项目和自动化工具思考 第3集 提效神器-MyBatisPlus课程总结 干货文档 第1集 项目引入Mybatis-plus-generator代码自动生成工具 简介:介绍Mybatis-plus-generator代码自动化生成工具 Mybatis-plus-generator..

dev666的博客 1061

小滴课堂-第十六章学习笔记:小滴课堂微服务架构+编写面试BAT高级工程师简历

愿景:"让编程不再难学,让技术与生活更加有趣" 更多架构课程请访问 xdclass.net 目录 ​愿景:"让编程不再难学,让技术与生活更加有趣" 第1集 你知道未来的小滴课堂微服务架构图吗? 第2集 你知道怎么编写一份合格的初级+高级工程师简历吗 第3集 编写面试大厂月薪20k+的高级工程师简历【原创】 第5集 简历项目经验之电商核心支付网关 第6集 简历项目经验之用户中心的作用 第7集 简历项目经验之营销插件服务 第1集 你知道未来的小滴课堂微服务架构图吗? 简介:概述分...

dev666的博客 852

小滴课堂-学习笔记:(19)【高级篇】AlibabaCloud微服务阿里云ECS容器化部署

愿景:"让编程不再难学,让技术与生活更加有趣" 更多架构课程请访问 xdclass.net 目录 第1集 配置文件Bug修复-网关重新打包推送 第2集 网关配置迁移阿里云Nacos配置中心和服务启动 第3集 视频和订单服务迁移阿里云Nacos配置中心和镜像打包 第4集 阿里云ECS服务器快速安装Mysql数据库 第5集 AlibabaCloud视频和订单服务阿里云启动 第6集 微服务阿里云部署全链路验证和线上测试 干货文档 第1集 配置文件Bug修复-网关重新打包推送 简介:脚..

dev666的博客 692

小滴课堂-学习笔记:(7)你知道结构型设计模式装饰器+代理模式 ?留下来聊聊

愿景:"让编程不再难学,让技术与生活更加有趣" 更多架构课程请访问 xdclass.net 目录 第1集 如虎添翼的设计模式-装饰器设计模式介绍 第2集 满足老王的改装搭配-玩转装饰器设计模式案例实战 第3集 JDK源码里面的Stream IO流-装饰器设计模式应用 第4集 加盟商来啦-你需要掌握的代理设计模式《上》 第5集 加盟商来啦-你需要掌握的代理设计模式《下》 第6集 大量使用第三方SDK-它们常用的外观设计模式你知道多少? 第7集 案例实战-外观设计模式在多渠道消息推送里..

dev666的博客 593

小滴课堂-学习笔记:(17)【高级篇】新版 JDK11+AlibabaCloud+Docker整合打包镜像推送

愿景:"让编程不再难学,让技术与生活更加有趣" 更多架构课程请访问 xdclass.net 目录 第1集 新版AlibabaCloud微服务本地镜像打包配置讲解 第2集 镜像打包脚本Dockerfile介绍和【新版JDK11】整合 第3集 AlibabaCloud-视频服务-订单服务Docker镜像打包 第4集 本地镜像推送阿里云私有镜像仓库 干货文档 第1集 新版AlibabaCloud微服务本地镜像打包配置讲解 简介:微服务Docker镜像打包讲解 官方文档:https://spr.

dev666的博客 578
上一篇: 小滴课堂-学习笔记:(10)关注对象之间的通信-行为型模式 终极篇
下一篇: 小滴课堂-学习笔记:(8)关注对象之间的通信-行为型模式应用《上》
dev666
博客等级 码龄9年 100粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dev666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值