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公司的....
修理水管....