首页 > 其他分享 >《图解设计模式》 第五部分 访问数据结构

《图解设计模式》 第五部分 访问数据结构

时间:2024-11-05 10:08:11浏览次数:1  
标签:图解 Support setNext next 数据结构 new trouble 设计模式 public

第十三章 Visotor 模式

public class file extends entry{
  /* 省略 */
  puhblic void accept(Visitor v){
    v.visit(this);
  }
}

public class Main{
  public static void main(String args){
    Directory rootdir = new Dirctory("root");
    /* 省略 */
    rootdir.accept(new ListVisitor());
  }
}

双重分发

这里的 Element accept(Visitory) 和 Visitor的 visit(Element) 他们是相反的关系。前者接受,后者访问。
这种消息分发方式一般被称为 双重分发(double dispatch)

为什么弄这么复杂?

Vistor 模式的目的是将处理的数据从数据结构中分离出来。这里的 ListVisitor 是遍历,我们可能也要做其他事情,比如 文件批量改名之类。所有的行为在 Visitor 的子类中实现就好。

开闭原则(The Open-Closed Principle, OCP)

对扩展是开放的
对修改是关闭的

第14章 Chain of Responsibility 模式

public class Main{
    public static void main(String[] args){
        Support alice = new NoSupport("Alice");
        Support bob = new LimitSupport("Bob", 100);
        Support charlie = new SpecialSupport("Charlie", 429);
        Support diana = new LimitSupport("Diana", 200);
        Support elmo = new OddSupport("Elmo");
        Support fred = new LimitSupport("Fred", 300);

        //设置处理链
        alice.setNext(bob).setNext(charlie).setNext(diana).setNext(elmo).setNext(fred);

        for(int i = 0; i < 500; i += 33){
            alice.support(new Trouble(i));
        }
    }
}


public abstract class Support{
    private Stirntg name;
    private Support next;

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

    public Support setNext(Support next){
        this.next = next;
        return next;
    }

    public final void support(Trouble trouble){
        if(resolve(trouble)){
            done(trouble);
        }else if(next != null){
            next.support(trouble);
        }else{
            fail(trouble);
        }
    }

    protected abstract boolean resolve(Trouble trouble);
    protected void done(Trouble trouble){
        System.out.println(trouble + " is resolved by " + this + ".");
    }

    protected void fail(Trouble trouble){
        System.out.println(trouble + " cannot be resolved.");
    }
}

public class LimitSupport extends Support{
    private int limit;

    public LimitSupport(String name, int limit){
        super(name);
        this.limit = limit;
    }

    protected boolean resolve(Trouble trouble){
        if(trouble.getNumber() < limit){
            return true;
        }else{
            return false;
        }
    }
}

Windows 系统中经常使用这个模式。

标签:图解,Support,setNext,next,数据结构,new,trouble,设计模式,public
From: https://www.cnblogs.com/dasuxd/p/18527319

相关文章

  • 红黑树的平衡之舞:数据结构中的优雅艺术
    文章目录前言......
  • 《图解设计模式》 第五部分 一致性
    第11章Composite模式文中举例文件夹系统,简单说明:这里可以讲File和dirctory看作一种东西Entry。在Entry的基础上分化两者,构成结构。能够使容器与内容具有一致性,创造出递归结构。第12章Decorator模式publicclassMain{publicstaticvoidmain(String[]ar......
  • 设计模式小结一策略(strategy)模式
    先上结论:    一个不懂设计模式的程序员,是绝对写不好程序代码的,心中没有设计模式的概念,你写出代码,内行一看就是个草台班子。这篇文章仅是个人设计模式学习的一篇笔记,算是抛砖引玉,详细的概念和用法还需要自己敲代码一个个验证体会。开干!一、程序设计的基本原则:1、封......
  • 数据结构 -AVL Tree
    博客主页:【夜泉_ly】本文专栏:【数据结构】欢迎点赞......
  • Redis底层数据结构 SDS
    SDS字符串在Redis中是很常用的,键值对中的键是字符串类型,值有时也是字符串类型。Redis是用C语言实现的,但是它没有直接使用C语言的char*字符数组来实现字符串,而是自己封装了一个名为简单动态字符串(simpledynamicstring,SDS)的数据结构来表示字符串,也就是Redis的Stri......
  • 数据结构初阶排序全解
    目录1>>排序前言2>>插入排序2.1>>直接插入排序2.2>>希尔排序3>>选择排序3.1>>直接选择排序3.2>>堆排序4>>交换排序4.1冒泡排序4.2快速排序5>>归并排序6>>测试test.csort.hsort.c7>>总结1>>排序前言    排序顾名思义,就是将一组乱序的数,按从大到小......
  • 数据结构做题记录(1)
    1:P11071「QMSOIR1」DistortedFate二进制的题,优先想到拆位求贡献。因为是或,对于某一位,找到区间中最左的这一位为\(1\)的位置,然后相应的乘上它到右端点的距离,就可以计算答案了。\(logV\)是\(30\),可以想到对二进制的每一位开一棵线段树,维护区间中这一位相关信息。然后就......
  • C语言版数据结构算法(考研初试版—3)--链表定义、创建
    2、链表1、链表结构体typedefstructLNode{   intdata;   structLNode*next; }LNode,*LinkList; 2、遍历链表voidPrintList(LinkListL){   LinkListp=L->next;//Skiptheheadnodewhichisadummynode   while(p!=......
  • C语言版数据结构算法(考研初试版—4)--链表删除操作
    删除链表中值为m的结点(1)创建一个链表(2)打印删除前的链表(3)查找值为m的前一个结点(4)执行删除操作(5)打印删除后的链表#include<stdio.h>#include<stdlib.h>typedefstructLNode{ intdata; structLNode*next;}LNode,*LinkList;//头插法LinkListCreateList_L(){......
  • 《图解设计模式》 第三部分 生成实例
    第五章Singleton模式单例模式应该是开发中用的比较多的模式。这里我只记一个知识点。多线程下安全的单例模式的一个知识点publicclassSingleton{publicstaticInstanceClassinstance=null;publicstaticSingletongetInstance(){if(instance==null){......