装饰设计模式: 就是对想要的类功能进行加强…
例如: FileWriter
与 BufferedWriter
BufferedWriter就是用的装饰模式对FileWriter的功能进行增强. 效率的增强.
不仅如此…装饰设计模式还有解耦的作用
装饰和继承都能实现一样的特点: 进行功能的扩展增强
但是继承耦合性会大…并且后面很能解耦
装饰设计模式例子:
人在以前只有饭吃…
public class Demo {
public static void main(String[] args) {
Person p = new Person();
p.chifan();
}
}
class Person {
void chifan() {
System.out.println("吃饭");
}
}
运行结果:
现在生活好了…能吃的东西也变多了…
我们可以对吃饭这个功能利用装设设计模式进行加强
public class Demo {
public static void main(String[] args) {
Person p = new Person();
//p.chifan();
NewPerson np = new NewPerson(p);
np.chifan();
}
}
class Person {
void chifan() {
System.out.println("吃饭");
}
}
class NewPerson {
private Person p;
NewPerson(Person p) {
this.p = p;
}
void chifan() {
System.out.println("开胃酒");
p.chifan();
System.out.println("甜点");
}
}
运行结果:
如果用继承话…
public class Demo {
public static void main(String[] args) {
NewPerson p = new NewPerson();
p.chifan();
}
}
class Person {
void chifan() {
System.out.println("吃饭");
}
}
class NewPerson extends Person{
void chifan() {
System.out.println("开胃酒");
super.chifan();
System.out.println("甜点");
}
}
运行结果也是和刚刚用装饰设计模式一样的
假设我们用操作文件的例子(类什么的都是虚构的)
Writer
|-- TextWriter: 用于操作文本
|--BufferTextWriter: 加入了缓冲技术的操作文本的对象
|-- MediaWriter: 用于操作媒体
|--BufferMediaWriter: 加入了缓冲技术的操作媒体的对象
到这里就已经可以了. 但是这样做好像并不理想.
我们发现只为提高功能. 进行继承. 导致继承体系越来越臃肿. 不够灵活
这一种是让缓冲和具体的对象相结合.
我们将缓冲进行单独的封装, 那个对象需要缓冲就将那个对象和缓冲关联
就想FileWriter
与 BufferedWriter
一样
所以装饰比继承灵活.
特点: 装饰类和被装饰类都必须所属同一个接口或者父类