装饰器模式(Decorator Pattern),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式比生成子类更灵活。 ----《大话设计模式》
看需求
image.png若使用 继承
image.png现在只有Plumber、Carpenter工种,A、B俩公司,若随着Clearner、Gardener..等工种出现m种,公司C、D...的出现n个,那么类的数量将爆炸式的增长,m*n。
若使用 装饰器模式
image.png现在只有Plumber、Carpenter工种,A、B俩公司,若随着Clearner、Gardener..等工种出现m种,公司C、D...的出现n个,那么类的数量将只是线性增长,m+n。
代码示例
//Plumber类 (Carpenter同此)
public class Plumber implements Worker {
@Override
public void dosth() {
// TODO Auto-generated method stub
System.out.println("修水管");
}
}
//WorkerDecrator类
public class WorkerDecrator implements Worker{
Worker worker;
public WorkerDecrator(Worker worker) {
// TODO Auto-generated constructor stub
this.worker = worker;
}
@Override
public void dosth() {
// TODO Auto-generated method stub
this.worker.dosth();
}
}
//AWorker类,代表A公司。(BWork、CWork... 同此)
public class AWorker extends WorkerDecrator {
public AWorker(Worker worker) {
super(worker);
// TODO Auto-generated constructor stub
}
@Override
public void dosth() {
// TODO Auto-generated method stub
System.out.println("您好,我是A公司的员工为您服务~");
super.dosth();
}
}
public class Test {
public static void main(String [] args) {
//A公司的木匠
Carpenter cpt = new Carpenter();
AWorker aCpt = new AWorker(cpt);
aCpt.dosth();
//B公司的水管工
Plumber plmb = new Plumber();
BWorker bPlmb = new BWorker(plmb);
bPlmb.dosth();
}
}
您好,我是A公司的员工为您服务~
修门窗
您好,B公司派我为您服务~
修水管
java的IO系统中 就大量使用了装饰器模式,例如充当装饰功能的IO类如BufferedInputStream等,又被称为高级流,通常将基本流作为高级流构造器的参数传入,将其作为高级流的一个关联对象,从而对其功能进行扩展和装饰。
网友评论