Jelajahi Sumber

0718 IO 装饰器模式

Qing 10 bulan lalu
induk
melakukan
dcf5304c6a

+ 1 - 0
springboot-demo/data/some.txt

@@ -0,0 +1 @@
+987654321

+ 39 - 0
springboot-demo/src/main/java/com/sf/javase/io/ReaderMain.java

@@ -0,0 +1,39 @@
+package com.sf.javase.io;
+
+import lombok.SneakyThrows;
+
+import java.io.*;
+
+/**
+ * 对于文本数据 使用字符流更加方便
+ * 对于非文本数据(图片、音频、视频等)  只能使用字节流
+ */
+public class ReaderMain {
+
+    public static void main(String[] args) {
+//        File file = new File("data/some.txt");
+//        readFileByReader(file);
+
+        File file2 = new File("data/some2.txt");
+        writeFileByWriter(file2,"987654321");
+    }
+
+    @SneakyThrows
+    public static void readFileByReader(File file) {
+        Reader reader = new FileReader(file);
+        // 字符流可以直接使用字符数组
+        char[] buffer = new char[(int) file.length()];
+        int read = reader.read(buffer);
+        System.out.println(new String(buffer));
+        System.out.println(read);
+
+        reader.close();
+    }
+
+    @SneakyThrows
+    public static void writeFileByWriter(File file, String content) {
+        Writer writer = new FileWriter(file);
+        writer.write(content);
+        writer.close();
+    }
+}

+ 114 - 0
springboot-demo/src/main/java/com/sf/javase/io/StreamMain.java

@@ -0,0 +1,114 @@
+package com.sf.javase.io;
+
+import lombok.SneakyThrows;
+
+import java.io.*;
+
+/**
+ * 文件的拷贝 a.txt -> b.txt
+ * 从a中读 往b中写
+ */
+public class StreamMain {
+
+    public static void main(String[] args) {
+        // File 是找到这个文件
+//        File file = new File("/Users/Qing/Projects/IdeaProjects/SiFu/VIP31/springboot-demo/some.txt");
+//        // 是不是文件
+//        System.out.println(file.isFile());
+
+//        File file1 = new File("/Users/Qing/Projects/IdeaProjects/SiFu/VIP31/springboot-demo");
+//        // 是不是文件夹
+//        System.out.println(file1.isDirectory());
+
+        // 在获取文件时 以当前项目作为根路径  来文件的拼接相对路径
+        File file = new File("data/some.txt");
+        System.out.println(file.getAbsolutePath());
+
+//        readFile(file);
+//        readFile1(file);
+//        readFile2(file);
+//        readFile3(file);
+        writeFile(file,"0123456789");
+    }
+
+    @SneakyThrows
+    public static void readFile(File file) {
+        // IO流是读写文件
+        InputStream inputStream = new FileInputStream(file);
+        while (true) {
+            // 循环调用read()直到返回-1
+            int n = inputStream.read();
+            if (n == -1) break;
+            // 通过字节数组接收数据
+            byte[] bytes = new byte[1];
+            bytes[0] = (byte) n;
+            System.out.println(new String(bytes));
+        }
+        // 流是资源  资源需要手动关闭
+        inputStream.close();
+    }
+
+    @SneakyThrows
+    public static void readFile1(File file) {
+        InputStream inputStream = new FileInputStream(file);
+        // 创建一个和文件长度相等的字节数组
+        byte[] bytes = new byte[(int) file.length()];
+        // 将流中的数据读入到字节数组中
+        inputStream.read(bytes);
+        System.out.println(new String(bytes));
+        inputStream.close();
+    }
+
+    // 在一个一个读取和直接全部读取之间 使用批量的按照指定大小来读取
+    @SneakyThrows
+    public static void readFile2(File file) {
+        // 文件中的数据都进入了inputstream 输入流
+        InputStream inputStream = new FileInputStream(file);
+        // 创建一定长度的字节数组作为缓冲
+        byte[] bytes = new byte[16];
+        // 记录读取的次数
+        int cnt = 0;
+        // 将流中的数据循环读入到字节数组中
+        while (true) {
+            // 使用read(读取出的数据要存放的字节数组,偏移量,预读取长度)
+            // 返回的是实际读取的长度
+            // 123456789123456789123456789
+            // 第一次读取 想要16 返回16   1234567891234567
+            // 第二次读取 想要16 返回11   89123456789
+            // 第三次读取 想要16 返回-1
+            int len = inputStream.read(bytes, 0, bytes.length);
+            cnt++;
+            if (len == -1) break;
+
+            // 用String的类似构造器得到字符串
+            System.out.println(new String(bytes, 0, len));
+        }
+        System.out.println(cnt);
+        inputStream.close();
+    }
+
+    @SneakyThrows
+    public static void readFile3(File file) {
+        // IO流是读写文件
+        InputStream inputStream = new FileInputStream(file);
+        byte[] bytes = new byte[16];
+        int len = 0;
+        while ((len = inputStream.read(bytes)) != -1) {
+            System.out.println(new String(bytes, 0, len));
+        }
+        inputStream.close();
+    }
+
+    @SneakyThrows
+    // 写数据 文件本身 和 文件内容
+    public static void writeFile(File file, String content) {
+        // 把内容转化为字节数组
+        // 把文件转为输出流
+        // 把字节数组写入到输出流
+        byte[] bytes = content.getBytes();
+        OutputStream outputStream = new FileOutputStream(file);
+        outputStream.write(bytes);
+        outputStream.close();
+    }
+
+}

+ 31 - 0
springboot-demo/src/main/java/com/sf/javase/io/pattern/CofferBar.java

@@ -0,0 +1,31 @@
+package com.sf.javase.io.pattern;
+
+import com.sf.javase.io.pattern.decorator.Chocolate;
+import com.sf.javase.io.pattern.decorator.Decorator;
+import com.sf.javase.io.pattern.decorator.Sugar;
+import com.sf.javase.io.pattern.drink.Coffee;
+import com.sf.javase.io.pattern.drink.Drink;
+import com.sf.javase.io.pattern.drink.Milk;
+
+// 咖啡店
+public class CofferBar {
+
+    public static void main(String[] args) {
+        // 售卖咖啡时 生成了一笔订单 订单中包含饮品+小料
+        Drink coffee = new Coffee();
+        System.out.println(coffee.getDescription());
+        System.out.println(coffee.cost());
+
+        // 加了小料的咖啡
+        Decorator chocolateCoffee = new Chocolate(coffee);
+        System.out.println(chocolateCoffee.getDescription());
+        System.out.println(chocolateCoffee.cost());
+
+        System.out.println("=========");
+
+        Drink milk = new Milk();
+        Decorator sugarMilk = new Sugar(milk);
+        System.out.println(sugarMilk.getDescription());
+        System.out.println(sugarMilk.cost());;
+    }
+}

+ 13 - 0
springboot-demo/src/main/java/com/sf/javase/io/pattern/decorator/Chocolate.java

@@ -0,0 +1,13 @@
+package com.sf.javase.io.pattern.decorator;
+
+import com.sf.javase.io.pattern.drink.Drink;
+
+// 小料 巧克力
+public class Chocolate extends Decorator {
+
+    public Chocolate(Drink drink) {
+        super(drink);
+        super.setDescription("加巧克力");
+        super.setPrice(1);
+    }
+}

+ 31 - 0
springboot-demo/src/main/java/com/sf/javase/io/pattern/decorator/Decorator.java

@@ -0,0 +1,31 @@
+package com.sf.javase.io.pattern.decorator;
+
+import com.sf.javase.io.pattern.drink.Drink;
+
+// 装饰类
+// 想要将饮品和小料组装
+public class Decorator extends Drink {
+
+    // 类和类的关系 : 继承和组合
+    // A extends B   A is a B  例如:教学楼是一种建筑
+    // A{ B b} A声明了一个属性是B   A has a B  例如:教学楼有饮水机
+    // 在装饰器类中  既有继承关系 又有组合关系
+
+    // 设置一个属性 也是饮品
+    private Drink drink;
+
+    public Decorator(Drink drink) {
+        this.drink = drink;
+    }
+
+    @Override
+    public double cost() {
+        // 用小料的价格 加上饮品的实际价格
+        return super.getPrice() + drink.cost();
+    }
+
+    @Override
+    public String getDescription() {
+        return drink.getDescription() + super.getDescription();
+    }
+}

+ 13 - 0
springboot-demo/src/main/java/com/sf/javase/io/pattern/decorator/Soy.java

@@ -0,0 +1,13 @@
+package com.sf.javase.io.pattern.decorator;
+
+import com.sf.javase.io.pattern.drink.Drink;
+
+// 咖啡豆
+public class Soy extends Decorator {
+
+    public Soy(Drink drink) {
+        super(drink);
+        super.setDescription("加咖啡豆");
+        super.setPrice(0.5);
+    }
+}

+ 13 - 0
springboot-demo/src/main/java/com/sf/javase/io/pattern/decorator/Sugar.java

@@ -0,0 +1,13 @@
+package com.sf.javase.io.pattern.decorator;
+
+import com.sf.javase.io.pattern.drink.Drink;
+
+// 糖
+public class Sugar extends Decorator {
+
+    public Sugar(Drink drink) {
+        super(drink);
+        super.setPrice(0.1);
+        super.setDescription("加糖");
+    }
+}

+ 16 - 0
springboot-demo/src/main/java/com/sf/javase/io/pattern/drink/Coffee.java

@@ -0,0 +1,16 @@
+package com.sf.javase.io.pattern.drink;
+
+// 咖啡
+public class Coffee extends Drink {
+
+    public Coffee() {
+        super.setDescription("这是没打折的咖啡");
+        super.setPrice(10);
+    }
+
+    @Override
+    public double cost() {
+        // 直接返回标价
+        return super.getPrice();
+    }
+}

+ 15 - 0
springboot-demo/src/main/java/com/sf/javase/io/pattern/drink/Drink.java

@@ -0,0 +1,15 @@
+package com.sf.javase.io.pattern.drink;
+
+import lombok.Data;
+
+// 饮品  设置为抽象类
+@Data
+public abstract class Drink {
+
+    // 描述
+    private String description;
+    // 价格
+    private double price;
+    // 最终消费的价格
+    public abstract double cost();
+}

+ 16 - 0
springboot-demo/src/main/java/com/sf/javase/io/pattern/drink/Milk.java

@@ -0,0 +1,16 @@
+package com.sf.javase.io.pattern.drink;
+
+// 牛奶
+public class Milk extends Drink {
+
+    public Milk() {
+        super.setDescription("这是打了八折的牛奶");
+        super.setPrice(8);
+    }
+
+    @Override
+    public double cost() {
+        double price = super.getPrice();
+        return price * 0.8;
+    }
+}