装饰设计模式
对一组对象的功能进行增强时,就可以使用该该模式进行
问题的解决
public class Io18_1 {
public static void main(String[] args) {
Person p=new Person();
// p.chifan()
NewPerson p1=new NewPerson(p);//装饰
p1.chifan();
NewPerson2 p2=new NewPerson2();//继承
p2.chifan();
}
}
class Person{
void chifan(){
System.out.println("吃饭");
}
}
//这个类的出现是为了增强person而出现的。
class NewPerson{
private Person p;
NewPerson(Person p){
this.p=p;
}
public void chifan(){
System.out.println("开胃酒");
p.chifan();
System.out.println("甜酒");
}
}
class NewPerson2 extends Person{
void chifan(){
System.out.println("开胃酒");
super.chifan();
System.out.println("甜酒");
}
}
字符流-缓冲区-装饰设计模式和继承的区别
装饰和继承都能实现一样的特点,进行功能的扩展增强。
- 有什么区别呢?
- 举例
首先有一个继承体系
- Writer
- |–TextWriter:用于操作文本
|–MediaWriter:用于操作媒体
想要对操作的动作进行效率的提高,
- 按照面向对象,可以通过继承对具体的进行功能的扩展。
效率提高需要加入缓冲技术。
Writer
- |–TextWriter:用于操作文本
- |–BufferTextWriter:加入了缓冲技术的操作文本的对象。
- |–MediaWriter:用于操作媒体
|–BufferMediaWrite:
到这里就可以了。但是这样做好像并不理想。
-
- 如果这个体系进行功能扩展,就多了流对象。
- 那么这个流要提高效率,是不是也要产生子类呢?是。这时就会发现只为提高功能,进行的继承。
导致继承体系越来越臃肿,不够灵活。
重新思考这个问题?
- 既然加入的都是同一种技术–缓冲。
- 前一种是让缓冲和具体的对象相结合。
- 可不可以将缓冲进行单独的封装,哪个对象需要缓冲就将哪个对象和缓冲关联。
class BufferWriter{1
BufferWriter(BufferTextWriter w){
}
BufferWriter(BufferMediaWrite w){
}
}
2比1好很多,体现了多态的好处
class BufferWriter{2
BufferWriter(Writer w){
}
}
Writer
|–TextWriter:用于操作文本
|–MediaWriter:用于操作媒体
|–用于提高效率
装饰比继承灵活。
特点:装饰类和被装饰类都必须所属同一个接口或者父类。