package com.heima.io;
/*装饰设计模式:当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。那么自定义的该类称为装饰类。
装饰类通常会通过构造方法接收被装饰的对象。
并基于被装饰的对象的功能,提供更强的功能。*/
class Person// 上机演示程序十六*****************************************************
{
public void chifan() {
System.out.println("吃饭");
}
}
class SuperPerson {
private Person p;
SuperPerson(Person p) {
this.p = p;
}
public void superChifan() {
System.out.println("开胃酒");
p.chifan();
System.out.println("甜点");
System.out.println("来一根");
}
}
class PersonDemo {
public static void main(String[] args) {
Person p = new Person();
// p.chifan();
SuperPerson sp = new SuperPerson(p);
sp.superChifan();
}
}
案例二:
package com.heima.io;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
/*明白了BufferedReader类中特有方法readLine的原理后,
可以自定义一个类中包含一个功能和readLine一致的方法。来模拟一下BufferedReader*/
class MyBufferedReader extends Reader
{
private Reader r; // 上面继承了Reader后必须重写Reader中的抽象方法
MyBufferedReader(Reader r)// 将FileReader 变成Reader能接受更多类型的对象
{
this.r = r;
}
// 可以一次读一行数据的方法。
public String myReadLine() throws IOException { // 定义一个临时容器。原BufferReader封装的是字符数组。
// 为了演示方便。定义一个StringBuilder容器。因为最终还是要将数据变成字符串。
StringBuilder sb = new StringBuilder();
int ch = 0;
while ((ch = r.read()) != -1) {
if (ch == '\r')
continue;
if (ch == '\n')
return sb.toString();
else
sb.append((char) ch);
}
if (sb.length() != 0)//假如有一行没有回车换行,也要写回去
return sb.toString();
return null;
}
/* 覆盖Reader类中的抽象方法。 */
public int read(char[] cbuf, int off, int len) throws IOException {
return r.read(cbuf, off, len);
}
public void close() throws IOException {
r.close();
}
public void myClose() throws IOException {
r.close();
}
}
public class MyBufferedReaderDemo {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("xxx.txt");
MyBufferedReader myBuf = new MyBufferedReader(fr);
String line = null;
while ((line = myBuf.myReadLine()) != null) {
System.out.println(line);
}
myBuf.myClose();
}
}
|
|