需求:A公司有汽车和单车修理员,为了保证服务质量,A公司要求员工在去客户家里服务时,开始说一句:“你好”
需设计一个装饰类,用来实现这个事情
//总公司
public interface Worker {
public void doSomeWorker();
}
//A公司从总公司那接业务,派相关的人员去完成工作
public class AWorker implements Worker {
private Worker worker;
public AWorker(Worker worker){//根据所派的实际员工为其加“你好”功能
this.worker=worker;
}
@Override
public void doSomeWorker() {
System.out.println("你好");
worker.doSomeWorker();
}
}
//修汽车的工人
public class Car implements Worker {
@Override
public void doSomeWorker() {
System.out.println("修汽车");
}
}
//修单车的工人
public class Bike implements Worker {
@Override
public void doSomeWorker() {
System.out.println("修单车");
}
}
如果需要汽车工人,输出为:你好,修汽车
上述装饰者为AWorker类,被装饰者为Car和Bike,Aworker为Car和Bike增加了“你好”功能。
上述就是一个简单的装饰者设计模式,AWorker为装饰类,AWorker和Car、Bike类都实现了Worker接口。在java中,I/O中的节点流和处理流也是采用的“装饰者设计模式”
示例:public static void main(String[] args) { FileReader fileReader=null;//节点流
FileWriter fileWriter=null;
BufferedWriter bufferedWriter=null;
BufferedReader bufferedReader=null;//处理流
try{
fileReader =new FileReader("e:/a.txt");
bufferedReader=new BufferedReader(fileReader);
String s = bufferedReader.readLine();
fileWriter=new FileWriter("e:/b.txt");
bufferedWriter=new BufferedWriter(fileWriter);
while (true){
if(s==null){
break;
}
bufferedWriter.write(s);
bufferedWriter.flush();
}
}catch (Exception e){
System.out.println("文件读取失败");
}finally {
try{
fileReader.close();
fileWriter.close();
bufferedReader.close();
bufferedWriter.close();
}catch (Exception e){
System.out.println("文件关闭异常");
}
}
}
注意: FlieReader和BufferedReader的关系
FlieReader是被装饰者,作为参数传递给装饰者
BufferedReader是装饰者,在被装饰者的功能基础上再添加功能,在此处使用BufferedReader处理流,可以使用readLine()方法,一次可以读取一行数据。(原来一次只能读取一个字符)