美文网首页
装饰器模式

装饰器模式

作者: wustzhy | 来源:发表于2020-05-21 23:33 被阅读0次

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

    相关文章

      网友评论

          本文标题:装饰器模式

          本文链接:https://www.haomeiwen.com/subject/elzxahtx.html