思想:将原有的功能进行提升
步骤:
1.将被装饰者当做类中一个成员变量
2.在构造方法中 进行成员变量的赋值
赋值后就相当于可以拿到被装饰的这个对象
有这个对象就能调用该对象的方法
3.对方法进行升级
example1:
//上兴趣班的接口
interface Study{
//在兴趣班上课
public abstract void studys();
}
class Student implements Study{
@Override
public void studys() {
System.out.println("学吉他");
System.out.println("学画画");
}
}
//社会技能类
class Students implements Study{
//将学生作为成员变量
private Students student;
//生成构造方法
public Students(Students student) {
super();
this.student = student;
}
public Students() {
super();
// TODO Auto-generated constructor stub
}
//对学生方法进行升级
@Override
public void studys() {
//调用被装饰者的功能
student.studys();
//升级
System.out.println("学开车");
System.out.println("学电脑");
}
}
在main函数中调用:
Students student = new Students();
//注意:创建时 一定要给被装饰者赋值
Students loStudent = new Students(student);
loStudent.studys();
example2:
利用装饰者模式 实现获取设置行号功能
class lineNumberReader1 {
//声明成员变量(被包装的对象)
//成员变量 可以是抽象类也可以是接口
private Reader reader;
private int num = 0;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public lineNumberReader1(Reader reader) {
super();
this.reader = reader;
}
public lineNumberReader1() {
super();
// TODO Auto-generated constructor stub
}
//对功能升级
//从读取的方法中 获取行号
public String myReadLine() throws IOException {
num ++;
int len = 0;
StringBuffer stringBuffer = new StringBuffer();
while ((len = reader.read()) != -1) {
if (len != 10){
stringBuffer.append((char)len);
}else {
return stringBuffer.toString();
}
}
if (stringBuffer.length() == 0) {
return null;
}
//保证方法 肯定会有返回值
return stringBuffer.toString();
}
//关闭流方法
public void myClose() throws IOException {
reader.close();
}
}
在main函数中调用
File file = new File("/Users/Commander/Desktop/test/taylor.txt");
FileReader fr = new FileReader(file);
lineNumberReader1 line = new lineNumberReader1(fr);
String string= null;
line.setNum(100);
while ((string = line.myReadLine()) != null) {
System.out.println( line.getNum() + ":" + string);
}
line.myClose();