首页 > 其他分享 >设计模式学习(5)一致性

设计模式学习(5)一致性

时间:2022-08-20 17:17:08浏览次数:89  
标签:return String int display 学习 Override 一致性 设计模式 public

组合模式

  • 在文件系统中,文件夹和文件具有一致性
  • 将文件夹和文件当作同一种东西看

示例

模拟一个文件系统。文件和文件夹都具有名称和大小,我们将其抽象成Entry。

但是文件夹可以add文件或者文件夹,文件却不能add

class FileTreatmentException extends RuntimeException {
    public FileTreatmentException() {

    }

    public FileTreatmentException(String msg) {
        super(msg);
    }
}

public abstract class Entry {
    public abstract String getName();
    public abstract int getSize();
    public Entry add(Entry entry) throws FileTreatmentException {
        throw new FileTreatmentException();
    }
    protected abstract void printList(String prefix);
    public String toString() {
        return getName() + " (" + getSize() + ") ";
    }
}

public class Directory extends Entry{
    private String name;
    private ArrayList directory = new ArrayList();
    public Directory(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public int getSize() {
        Iterator it = directory.iterator();
        int size = 0;
        while (it.hasNext()) {
            Entry entry = (Entry)it.next();
            size += entry.getSize();
        }
        return size;
    }

    public Entry add(Entry entry) {
        directory.add(entry);
        return this;
    }

    @Override
    protected void printList(String prefix) {
        System.out.println(prefix + "/" + this);
        Iterator it = directory.iterator();
        while (it.hasNext()) {
            Entry entry = (Entry) it.next();
            entry.printList(prefix + "/" + name);
        }
    }
}

public class File extends Entry{
    public String name;
    private int size;

    public File(String name, int size) {
        this.name = name;
        this.size = size;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public int getSize() {
        return size;
    }

    @Override
    protected void printList(String prefix) {
        System.out.println(prefix + "/" + this);
    }
}

装饰器模式

  • 不断给类添加装饰的模式

示例

public abstract class Display {
    public abstract int getColumns();
    public abstract int getRows();
    public abstract String getRowText(int row);
    public final void show() {
        for (int i = 0; i < getRows(); i++) {
            System.out.println(getRowText(i));
        }
    }
}

public class StringDisplay extends Display {
    private String string;

    public StringDisplay(String string) {
        this.string = string;
    }

    @Override
    public int getColumns() {
        return string.getBytes().length;
    }

    @Override
    public int getRows() {
        return 1;
    }

    @Override
    public String getRowText(int row) {
        if (row == 0) return string;
        else return null;
    }
}

public abstract class Border extends Display {
    protected Display display;
    protected Border(Display display) {
        this.display = display;
    }
}

public class SideBorder extends Border {
    private char borderChar;
    protected SideBorder(Display display,char ch) {
        super(display);
        this.borderChar = ch;
    }

    @Override
    public int getColumns() {
        return 1 + display.getColumns() + 1;
    }

    @Override
    public int getRows() {
        return display.getRows();
    }

    @Override
    public String getRowText(int row) {
        return borderChar + display.getRowText(row) + borderChar;
    }
}

public class FullBorder extends Border{

    public FullBorder(Display display) {
        super(display);
    }
    @Override
    public int getColumns() {
        return 1 + display.getColumns() + 1;
    }

    @Override
    public int getRows() {
        return 1 + display.getRows() + 1;
    }

    @Override
    public String getRowText(int row) {
        if (row == 0) return "+" + makeLine('-', display.getColumns()) + "+";
        else if (row == display.getRows() + 1) return "+" + makeLine('-', display.getColumns()) + "+";
        else return "|" + display.getRowText(row - 1) + "|";
    }

    private String makeLine(char ch, int count) {
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < count; i++) {
            buf.append(ch);
        }
        return buf.toString();
    }
}


public class DecoratorTest {
    public static void main(String[] args) {
        Display b1 = new StringDisplay("hello world");
        Display b2 = new SideBorder(b1, '#');
        Display b3 = new FullBorder(b2);

        b1.show();
        b2.show();
        b3.show();
    }
}
  • 这里的装饰器继承了Display,同时还拥有一个display成员
  • 继承display是为了在装饰以后,能调用Display的方法,保持接口相同
  • 拥有一个display是为了保持原有display的实现,只对其做一些修饰

标签:return,String,int,display,学习,Override,一致性,设计模式,public
From: https://www.cnblogs.com/destinyzk/p/16608146.html

相关文章

  • SQLAlchemy学习-10. validates()校验器
    前言向属性添加“验证”的一种快速方法是使用validates()装饰器。校验器属性验证器可以引发异常,停止改变属性值的过程,或者可以将给定值更改为不同的值。与所有属性扩......
  • DevExpress学习
    LookUpEdit类图:DevExpress.XtraEditors.LookUpEditLookUpEdit→LookUpEditBase→PopupBaseAutoSearchEdit→PopupBaseEdit→ButtonEdit→TextEdit→BaseE......
  • ATUI学习记录
    AT-UI是一款基于Vue.js2.0的前端UI组件库,主要用于快速开发PC网站中后台产品特性基于Vue开发的UI组件使用npm+webpack+babel的工作流,支持ES2015CSS......
  • Kubernetes学习笔记(十四):Static Pods
    kubelet依赖于kube-apiserver来获得关于在其node上加载哪些pod的指令,这是基于存储在etcd数据库中的kube-scheduler所做的决定。kubelet也可以独立运行,可以创建pod,可以指定......
  • spring源码学习笔记1——解析xml生成BeanDefinition的过程解析
    spring源码学习笔记1——解析xml生成BeanDefinition的过程解析一丶Spring解析Xml生成BeanDefinition的流程1.指定xml路径解析xml首先需要知道xml的位置,如下我们构造了Ap......
  • 深度学习 之 模型部署【3】-ONNX 入门
    ONNX简介开放神经网络交换,OpenNeuralNetworkExchange,是一套表示网络模型的开放格式,由微软和FaceBook在2017年推出;通过几年的快速发展,大有一统整个AI模型(ml、dl)的......
  • 【Spring5学习笔记(4)】事务管理:
    事务1、什么是事务(1)事务是数据库操作的最基本单元,是逻辑上的一组操作,要么都成功,如果有一个失败则所有操作都失败(2)经典场景:银行转账2、事务的四个特性(ACID)(1)原子性:一组逻辑操......
  • 深度学习 之 模型部署【4】-libtorch入门 - pytorch部署torchscript 以及 c++ libto
    pytorch部署torchscriptfromtorchvision.modelsimportresnet34importtorch.nn.functionalasFimporttorch.nnasnnimporttorchimportcv2#读取一张图片,......
  • vue学习之------vuex通俗易懂篇(一)
    1、vuex的作用是什么?实现组件数据共享(可以先初步理解为把一些数据存在localStorage中,不管哪里需要,都能取到)2、vuex的使用场景(先有个初步印象)(1)后台管理系统:用户登陆之......
  • monodepth学习4-训练讲解
    训练学习monodepth2的训练过程由于存在多个训练模式和网络结构导致部分比较难以理解,这里我们结合网上的资料和自己对代码的理解进行简要地介绍,个人能力有限,对计算机视觉接......