在IO流的学习中,我们使用到了装饰者的设计模式。现在就详细的学习一下java的装饰者设计模式。
Java的装饰者模式就是 java程序在运行时可以动态扩大一个类的功能。
它的原理是:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。修饰类必须和原来的类有相同的接口。
修饰模式是类继承的另外一种选择。类继承在编译时候增加行为,而装饰模式是在运行时增加行为。
当有几个相互独立的功能需要扩充时,这个区别就变得很重要。在有些面向对象的编程语言中,类不能在运行时被创建,通常在设计的时候也不能预测到有哪几种功能组合。这就意味着要为每一种组合创建一个新类。相反,修饰模式是面向运行时候的对象实例的,这样就可以在运行时根据需要进行组合。
按照常规的继承模式,加入有m和公司,n个工种。那么该系统就需要m*n个子类,当m和n很大的时候,子类的数量也变得很大了。利用装饰者模式,可以减少定义的子类。
建立以下包结构
1:首先建立一个Worke 接口,所有的工人都继承与该接口。
public interface Worker {
public void doSomeWork();
}
2:建立程序员类和美工类
public class Coder implements Worker{
@Override
public void doSomeWork() {
// TODO Auto-generatedmethod stub
System.out.println("我是程序员!!");
}
}
//美工类
public class MeiGong implements Worker{
@Override
public void doSomeWork() {
// TODO Auto-generatedmethod stub
System.out.println("我是美工!!");
}
}
A公司的修饰类
public class Aworker implements Worker{
private Workerworker;
public Aworker(Worker worker){
this.worker = worker;
}
@Override
public void doSomeWork() {
// TODO Auto-generatedmethod stub
System.out.println("我是A公司的");
worker.doSomeWork();
}
}
B公司的修饰类
public class BWorker implements Worker {
private Workerworker;
public BWorker(Worker worker) {
this.worker = worker;
}
@Override
public void doSomeWork() {
// TODO Auto-generatedmethod stub
System.out.println("我是b公司的");
worker.doSomeWork();
}
}
主函数:
public class Test {
public static void main(String[] args) {
//生成一个A公司的程序员对象
//可以先生成一个程序员对象。在生成AWorker对象。
Coder coder= new Coder();
Aworker aworker = new Aworker(coder);
aworker.doSomeWork();
}
}
运行结果:
我是A公司的
我是程序员!!
这样就可以实现对一个类的动态修饰。