Java第十周
- 有交互功能的button
- JTextArea的rows和columns是显示值不是最大值
- 一个方法要接口 就给一个实现接口的类对象
- 事件和程序是多对多的
- 事件源getsource()
- 一个特殊的匿名内部类
- 接口里只有一个方法,其实可以用函数式接口整它,用lamda表达式来做
- 一个特殊的匿名内部类
io
- stream是流!!!有方向!!人往高处走,水往低处流,而且是顺序的一个一个来读写
- 它会不断的发生,你想进行读写操作的时候,正常情况下你是顺序访问内容
- java所有做io操作的时候基本流程是一样的
- 对Console file tcp等做io时用面向对象的设计来统一了
- 有四个树的任意组成元素Input output byte character
- 举个例子:输入的字节流Inupt byte stream
- 那么什么是byte和character呢?
- 如果联想到Java中一个char是两个字节,猜测bytestream一次读一个字节,character stream读两个字节?(这样是不对的)
- “我们学习JAVA”是八个字符,十二个字节,所以不能统一除以二理解~因为中美开花()
- 在适用范围上有什么区别呢?
- 字节流是everything can use
- 字符留是only control 文本
- reader writer的基类就是inputstream和outputstream
- inputstream reader是byte stream 到character stream的bridge
- inputstream是抽象类
- 其实可以skip掉一些内容,但是skip之后就回不来惹
- 为什么没有readline在inputstream嘞?
- 其实很简单,因为没有真正意义上的line这样的概念,可以理解为这个是byte字节类型读进来的 而不是读字符,咱不关心字符的内容,所以看不到换行符类似’/n’这样的内容
- 第二,还有一个方面,刚刚提到byte和character的差异导致没有readline,但是reader里面也没有readline。
如果按照流的本质,变成读一行才结束,这就需要一个缓冲区来保存,但是这样子tooo南了!存不住啊!
So remember or read whole line is impossible in basic class!
总而言之 readline isn’t a standard way to sequence read.
- 四个大基类里面讲一个就行,就能满足全部,所以我们来讲讲input byte stream
- 看接下来这个设计模式,就是它让java的io很good
装饰模式
-
先来举个例子
- 其实每种运输工具也有类似的能力,而且我们还要排列组合,汽油人力货运陆地;柴油引擎客运水上…等等等等
- 这样我们要干得也忒多了!so如何解决呢?
- 一个烧汽油的不知道自己是飞的还是游的,这就有主次要特征的区别,主要特征就可以用主类去派生出来
- 所以就把粉色部分的次要特征排列组合来满足主要特征的需求
- 至此正式提出装饰模式
-
第一,给所有次要特征派生出一个中间基类继承自主类
- 首先客运这个子类是运输工具吗?
当然是的,他是间接子类,他的父类得父类就是运输工具 - 次要特征既可以修饰主要也可以修饰次要特征
- 综上:装饰模式=动态为一个对象扩展额外的功能+继承关系的一种替代方案+动态的撤销or增加功能
- 当然有一些很无意义的方案,就需要我们自己去用逻辑判断
-
- Decorator是抽象装饰:
- Component是抽象构件:
- Concrete Component是具体构建:
- Concrete Decorator是具体装饰:负责給构建对象贴上附加的责任构建
-
来个代码例子!
- 主类和主要特征
- 次要特征的基类
- 次要特征
- 运行-嵌套
- 如果你想要再来一层那就new CVehicle(new BVehicle(new AVehicle()))
- 主类和主要特征
-
回到io
-
对一个输入输出来说;输入输出到底是输入输出了什么是主要特征也就是媒体流;其次就是我要怎么输入输出也就是过滤流;
- Inputstream如上图,媒体流=media stream=输入输出的介质;过滤流=filter stream=不涉及输入输出什么但是帮助我们输入输出
- 实心的是主要特征,空心的是次要特征
- 实心的管子不能套,但是空心的管子可以套娃套娃套娃
- 实心的是最大基类的子类,没办法整活,而空心的管子不管再多!也一定要有一个实心的管子!
-
再一次回归装饰模式
- 装饰模式让类变少了,但是让对象变多了,本质上用对象换类!
public class Demo {
public static void main(String[] args){ //应用
Person p1 = new High(new Man());
p1.move();
}
}
abstract class Person {
abstract void move();
}
class Man extends Person{
@Override
void move() {
System.out.println("man move");
}
}
class Decorator extends Person{
Person p1;
Decorator(Person p1){
this.p1 = p1;//这样就能实现decorator的类能够拥有其他Person直接or间接子类的内容
}
@Override
void move() {
p1.move();//这样就能实现decorator的子类一个个的按照要求使用Move方法
}
}
class High extends Decorator{
High(Person p1) {
super(p1);//调用父类的构造函数
}
@Override
void move() {
System.out.println("Person is high ");//自己次要装饰的属性
super.move();//上一级的属性
}
}