----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的该类称为装饰类。
class Person
{
public void chifan()
{...}
}
//增强:
class SuperPerson
{
private Person p;
SuperPerson(Person p)
{
this.p=p;
}
public void superChifan()
{
...开胃酒;
p.chifan();
。。。甜点;
。。。来一根;
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p=new Person();
p.chifan();
}
}
装饰类通常会通过构造方法接收被修饰的对象
并基于被修饰的对象的功能,提供更强的功能
装饰和继承的区别
MyReader:专门用于读取数据的类
--MyTextReader
--MyBufferTextReader
--MyMediaReader
--MyBufferMediaReader
--MyDataReader
--MyBufferDataReader
集成体系非常臃肿~
优化:
class MyBufferReader
{
MyBufferReader(MyReader r)
{...}
}
装饰模式比继承灵活,避免了继承体系的臃肿,降低了类与类之间的关系,装饰类因为是增强已有对象,具备的功能与已有对象是相同的,只不过功能更强,所有装饰与被装饰类都所属于同一个父类或同一个接口。从继承结构变成组合结构了~
LineNumberReader
FileReader fr=new FileReader("PersonDemo.java");
LineNumberReader lnr=new LineNumberReader(fr);
String line=null;
lnr.setLineNumber(100);
while((line=lnr.readLine())!=null)
{
System.out.println(lnr.getLineNumber()+":"+line);
}
lnr.close();
10 IO流 MyLineNumberReader
import java.io.*;
class MyLineNumberReader
{
private Reader r;
private int lineNumber;
MyLineNumberReader(Reader r)
{
this.r=r;
}
public String myReadLine()throws IOException
{
lineNumber++;
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;
}
public void setLineNumber(int LineNumber)
{
this.lineNumber=lineNumber;
}
public void myClose()throws IOException
{
r.close();
}
}
class MyLineNumberReaderDemo
{
public static void main(String[] args)throws IOException
{
FileReader fr=new FileReader("copyTextMyBuf.java");
MyLineNumberReader mylnr=new MyLineNumberReader(fr);
String line=null;
while((line=mylnr.myReadLine())!=null)
{
System.out.println(mylnr.getLineNumber()+"::"+line);
}
mylnr.myClose();
}
}
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------