装饰设计模式
l对原有类进行了功能的改变,增强。
l装饰模式的基本格式。
l它与继承有什么不同?
package cn.itcast.io.p5.wrapper;
public class WrapperDemo {
/**
* @param args
*/
public static void main(String[] args) {
Person p = new Person();
// NewPerson p = new NewPerson();
NewPerson pp = new NewPerson(p);
pp.chifan();
/*
* 装饰模式:为了解决给类的功能进行增强而出现的。
*
* Writer
* |--TextWriter
* |--MediaWriter
*
* 想要对流对象的功能进行增强,比如提高写入的效率。
* 使用缓冲技术。
* Writer
* |--TextWriter
* |--BufferedTextWriter
* |--MediaWriter
* |--BufferedMediaWriter
*
* 每一个子类这样实现是可以的,但是导致继承体系较为臃肿。
* 发现其实无论哪个子类需要高效,使用的都是缓冲技术。
* 干脆将缓冲技术进行单独的描述和封装。
* 要缓冲区谁,就将谁传给缓冲区。
* BufferdWriter
*
* class BufferedWriter extends Writer
* {
* BufferedWriter(Writer w)
* {}
* }
*
* 装饰设计模式。
* Writer
* |--TextWriter
* |--MediaWriter
* |--BufferedWriter
*
* 装饰类和被装饰的特点:
* 1,装饰类中的构造函数需要接受被装饰类。
* 2,装饰类和被装饰类应该所属于同一个体系。
*
*/
}
}
class Person{
void chifan(){
System.out.println("吃饭");
}
}
class NewPerson{
private Person p ;
NewPerson(Person p){
this.p = p;
}
public void chifan(){
System.out.println("开胃酒");
p.chifan();
System.out.println("甜点");
System.out.println("来一根");
}
}
/*
class NewPerson extends Person{
@Override
void chifan() {
System.out.println("开胃酒");
super.chifan();
System.out.println("甜点");
System.out.println("来一根");
}
}
*/
要求你自己实现一个类MyInputStream读取文件,且不能抛出异常
Is a --- > 是一个Has a 有一个 - 包裹
包装、包裹:
自己不实现任何功能,所有功能都是通过内部的成员变量实现的。
包装是指一个类是某个类的子类,且拥有这个类的成员,就是包装模式。
如果A包装了B则:
A extends|implments B{
Private B b;
}
包装的目的是,让子类变成某个类的子类,且增强被包装类的方法。
包装类从来不做任何的工作,都是通过内部的被包装类,即成员变量执行方法的。
public class TestDemo {
public static void main(String[] args) throws Exception {
InputStream in = new MyInputStream("d:/a/a.txt");
byte[] b = new byte[1024];
int len = 0;
while((len=in.read(b))!=-1){
String s = new String(b,0,len);
System.err.print(s);
}
in.close();
}
}
class MyInputStream extends InputStream{
private InputStream in;
public MyInputStream(String fileName) {
try {
in = new FileInputStream(fileName);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public int read(byte[] b){
int len=-1;
try {
len = in.read(b);
} catch (IOException e) {
e.printStackTrace();
}
return len;
}
public void close(){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public int read() throws IOException {
return 0;
}
}