之所以关注这个模式,是因为最近对java的io感兴趣,因此上网查资料,而所有相关的资料都提到了该模式,咱一看不认识啊,于是注意力就到这个模式上了(想不想超链接的功能?)。
Decorator设计模式主要是为了增强某个特定类的功能。比如在原有操作之前或者之后增加一些操作等等。引入继承可以解决这个问题,即通过在子类里使用重载来实现。引入了继承的好处,同时也引入了继承的缺点,而Decorator模式就是为了解决继承的缺点而生的。
这里有一个例子:
这里模拟我们开发人员最熟悉的一个场景:软件工程领域的人力资源情况。
先看图:
[img]/upload/attachment/105990/38e3a4e2-dd83-3880-ac68-79a2b6514f03.png[/img]
Engineer是一个接口。
Coder是代码工人,有写代码的功能:doCodding() 方法。
现在发现人手不够用了,要求代码工人要在写代码之前做设计,或者写完了代码要写文档。
于是增加一个Coder的兄弟:MultiRoleEngineer。
MultiRoleEngineer和Coder都实现Engineer接口。
注意MultiRoleEngineer本身拥有一个Engineer的成员属性,通过构造方法来初始化该属性。
MultiRoleEngineer有2个子类,DesignCode和CodeFile,在这两个子类里重写doCodding() 方法。
进行测试:
运行结果:
Decorator设计模式主要是为了增强某个特定类的功能。比如在原有操作之前或者之后增加一些操作等等。引入继承可以解决这个问题,即通过在子类里使用重载来实现。引入了继承的好处,同时也引入了继承的缺点,而Decorator模式就是为了解决继承的缺点而生的。
这里有一个例子:
这里模拟我们开发人员最熟悉的一个场景:软件工程领域的人力资源情况。
先看图:
[img]/upload/attachment/105990/38e3a4e2-dd83-3880-ac68-79a2b6514f03.png[/img]
Engineer是一个接口。
package org.forefficiency.pattern.decorator;
public interface Engineer {
public void doCodding();
}
Coder是代码工人,有写代码的功能:doCodding() 方法。
package org.forefficiency.pattern.decorator;
public class Coder implements Engineer
{
public void doCodding() {
System.out.println("--I am codding!");
}
}
现在发现人手不够用了,要求代码工人要在写代码之前做设计,或者写完了代码要写文档。
于是增加一个Coder的兄弟:MultiRoleEngineer。
package org.forefficiency.pattern.decorator;
public class MultiRoleEngineer implements Engineer{
protected Engineer coder;
public void doCodding() {
doDesign();
coder.doCodding();
doFile();
}
public MultiRoleEngineer(Engineer cod)
{
this.coder = cod;
}
public void doDesign()
{
System.out.println("--I am doing design!");
}
public void doFile()
{
System.out.println("--I am doing file work!");
}
}
MultiRoleEngineer和Coder都实现Engineer接口。
注意MultiRoleEngineer本身拥有一个Engineer的成员属性,通过构造方法来初始化该属性。
MultiRoleEngineer有2个子类,DesignCode和CodeFile,在这两个子类里重写doCodding() 方法。
package org.forefficiency.pattern.decorator;
public class DesignCode extends MultiRoleEngineer {
public DesignCode(Engineer cod) {
super(cod);
}
public void doCodding() {
doDesign();
coder.doCodding();
}
public void doDesign() {
System.out.println("--I am doing design!");
}
}
package org.forefficiency.pattern.decorator;
public class CodeFile extends MultiRoleEngineer
{
public CodeFile(Engineer cod)
{
super(cod);
}
public void doCodding() {
coder.doCodding();
doFile();
}
public void doFile()
{
System.out.println("--I am doing file work!");
}
}
进行测试:
package org.forefficiency.pattern.decorator;
public class Test {
public static void main(String[] args)
{
Engineer cod = new Coder();
Engineer designCoder = new DesignCode(cod);
designCoder.doCodding();
designCoder = new CodeFile(cod);
designCoder.doCodding();
}
}
运行结果:
run:
--I am doing design!
--I am codding!
--I am codding!
--I am doing file work!
成功生成(总时间:0 秒)