一.为什么用装饰者设计模式
一般我们实现功能拓展时,通常使用继承的方式。但如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的。所以我们这时就用装饰者设计模式动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。
二.装饰者模式的设计作用
对扩展开放,对修改关闭,这句话体现在我如果想扩展被装饰者类的行为,无须修改装饰者类和被装饰类,只需继承装饰接口,实现额外的一些装饰或者叫行为即可对被装饰者进行包装。所以,扩展体现在继承、修改体现在子类中,这充分体现了依赖倒置原则。(这是我自己理解的装饰者设计模式谢谢其他人相互交流).三.如何实现装饰者设计模式
1.基本装饰。//定义装饰接口
public interface Human {
public void wearClothes();
public void walkToWhere();
}
//定义被装饰者,被装饰者初始状态有些自己的装饰
public class Person implements Human {
@Override
public void wearClothes() {
System.out.println("穿什么呢。。");
}
@Override
public void walkToWhere() {
System.out.println("去哪里呢。。");
}
}
//定义装饰者
public class Decorator implements Human {
private Human human;
public Decorator(Human human) {
this.human = human;
}
public void chuan() {
System.out.println("穿外套");
}
public void qunali() {
System.out.println("去公园");
}
@Override
public void wearClothes() {
human.wearClothes();
chuan();
}
@Override
public void walkToWhere() {
human.walkToWhere();
qunali();
}
}
public class Decorator2 implements Human {
private Human human;
public Decorator2(Human human) {
this.human = human;
}
public void chuan() {
System.out.println("穿秋衣");
}
public void qunali() {
System.out.println("去游乐场");
}
@Override
public void wearClothes() {
human.wearClothes();
chuan();
}
@Override
public void walkToWhere() {
human.walkToWhere();
qunali();
}
}
//测试类。
public class Test {
public static void main(String[] args) {
Human person = new Person();
Decorator decorator = new Decorator(person);
Human decorator2 = new Decorator2(decorator);
decorator2.wearClothes();
decorator2.walkToWhere();
}
}