Decorator设计模式

之所以关注这个模式,是因为最近对java的io感兴趣,因此上网查资料,而所有相关的资料都提到了该模式,咱一看不认识啊,于是注意力就到这个模式上了(想不想超链接的功能?)。
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 秒)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值