装饰器模式

2020-05-21  本文已影响0人  wustzhy

装饰器模式(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等,又被称为高级流,通常将基本流作为高级流构造器的参数传入,将其作为高级流的一个关联对象,从而对其功能进行扩展和装饰。

上一篇下一篇

猜你喜欢

热点阅读