什么是装饰模式:
按我的理解,装饰模式就相当于装潢,买了一个房子,里面有厨房,厕所,客厅等等,但是它们可能并不完全,比如说,客厅缺少沙发,厨房缺少餐具,装潢就是要将它们补全。而装饰模式就是相当于装潢,写代码不可能面面俱到,总有遗漏,去修改一个类,不如去添加一个新类,去补充。
如何制造一个装饰模式:
首先,我们需要一个接口,就像这样:
public interface Person {
void dosomething();
}
既然有了接口,我们就得去实现它,像这样:
public class Teacher implements Person {
@Override
public void dosomething() {
// TODO Auto-generated method stub
System.out.println("我会教书");
}
}
按照正常思路,到这里,我们就应该写我们的主类,然后通过主类中的main函数new一个Teacher,然后调用Teacher中dosomething函数输出打印。但是,很显然,很多时候,我们需要的信息远远不止这些,如此程序中,我们不仅想知道这个老师会教书,还想知道他来自哪个学校。当然,在Teacher中直接添加打印输入在本程序中十分简单,但是如果程序很大,需要修改的内容很多,或者是Teacher类不允许我们修改,该怎么办,这里就需要用到装饰模式。
接下要做的就是,再新建一个类,像这样:
public class DecoratorTeacher implements Person {
private Person p; //精髓在这里
public DecoratorTeacher(Person p) { //主函数可以new一个该类的对象,并传入,传入的自然是Person接口的子类,可以向上转型成Person类
this.p = p;
}
@Override
public void dosomething() {
// TODO Auto-generated method stub
System.out.println("我是XX大学的老师");
p.dosomething(); //然后,这里的p就是传入的子类了,虽然它的类型是Person类,但并没影响该子类里的内容
}
}
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Teacher teacher = new Teacher();
DecoratorTeacher dt = new DecoratorTeacher(teacher);
dt.dosomething();
}
}