美文网首页
java设计模式---装饰者模式

java设计模式---装饰者模式

作者: shuaidong | 来源:发表于2017-08-28 11:43 被阅读0次

    2装饰者模式

    简单理解装饰者模式

    装饰者模式就是在原来想做事情的接口上,在增加一些其他的想做的事情或者说其他想装饰他的一些动作。

    利用场景

    假设有一个Worker接口,它有一个doSomething方法,Plumber和Carpenter都实现了Worker接口,代码及关系如下。



    现有A、B两家公司,都有木工(Carpenter)和水管工(Plumber),但两公司的对两个工种的要求都不同,A公司要求员工在doSomething前自己介绍“我是A公司的”;B公司要求员工在doSomething前自己介绍“我是B公司的”;一个直接但不科学的设计方法是为每个公司都设计各自的木工(Carpenter)和水管工(Plumber),若公司增加到100个,则类要增加到200个,若再增加其他工种,则类会更多。

    根据场景提供解决办法

    此情况适合采用装饰者模式,为每个公司设计一个装饰类xWorker,xWorker也实现Worker接口,且有一个参数类型为Worker的构造函数和一个类型为Worker的成员变量,这样xWorker就可以取得相应类型worker的引用,在xWorker的doSomething()方法里处理各自公司的特殊要求:

    示例代码

    声明work接口,提供做事情的接口

    package decorator.pattern;
    public interface Worker {
    
        void doSomething();
    
    }
    

    定义木工(Carpenter)和水管工(Plumber)

    package decorator.pattern;
    
    
    /**
     * Created by td on 2017/8/22.
     */
    public class Carpenter implements Worker {
        @Override
        public void doSomething() {
            System.out.println("修门窗....");
        }
    }
    
    package decorator.pattern;
    
    /**
     * Created by td on 2017/8/22.
     */
    public class Plumber implements Worker {
        @Override
        public void doSomething() {
            System.out.println("修理水管....");
        }
    }
    
    

    定义A公司的装饰类AWork,需要实现work,并持有work的成员变量

    package decorator.pattern;
    
    /**
     * Created by td on 2017/8/22.
     */
    public class AWorker implements Worker {
        private Worker worker;
    
        public AWorker(Worker worker) {
            this.worker = worker;
        }
    
        @Override
        public void doSomething() {
            System.out.println("我是A公司的....");
            worker.doSomething();
        }
    }
    

    定义B公司的装饰类BWork,需要实现work,并持有work的成员变量

    package decorator.pattern;
    
    /**
     * Created by td on 2017/8/22.
     */
    public class BWorker implements Worker {
        private Worker worker;
    
        public BWorker(Worker worker) {
            this.worker = worker;
        }
    
        @Override
        public void doSomething() {
            System.out.println("我是B公司的....");
            worker.doSomething();
        }
    }
    
    

    测试代码

    package decorator.pattern;
    
    /**
     * Created by td on 2017/8/22.
     */
    public class Main {
        public static void main(String[] args) {
            Carpenter carpenter = new Carpenter();
    
            Plumber plumber = new Plumber();
            Worker worker = carpenter;
            worker.doSomething();
            worker = plumber;
            worker.doSomething();
    
            System.out.println("----------------------");
            AWorker aWorker = new AWorker(carpenter);
            aWorker.doSomething();
            aWorker = new AWorker(plumber);
            aWorker.doSomething();
    
            BWorker bWorker = new BWorker(carpenter);
            bWorker.doSomething();
            bWorker = new BWorker(plumber);
            bWorker.doSomething();
    
        }
    }
    

    运行结果:

    修门窗....
    修理水管....
    ----------------------
    我是A公司的....
    修门窗....
    我是A公司的....
    修理水管....
    我是B公司的....
    修门窗....
    我是B公司的....
    修理水管....
    
    

    相关文章

      网友评论

          本文标题:java设计模式---装饰者模式

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