设计模式——装饰模式(Decorator Pattern)

 装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

UML图:


模型类:

  Component类:

package com.cnblog.clarck;

/**
 * 接口对象,可以动态的给对象添加职责
 * 
 * @author clarck
 * 
 */
public abstract class Component {
    public abstract void Operation();
}

ConcreateComponent类:

package com.cnblog.clarck;

/**
 * 具体的装饰对象,起到给Component添加职责
 * 
 * @author clarck
 * 
 */
public class ConcreateComponent extends Component {

    @Override
    public void Operation() {
        System.out.println("具体对象的操作");
    }

}

	Decorator类:
package com.cnblog.clarck;

/**
 * 装饰抽象类,继承了Component,从外来类来扩展Component类的功能,
 * 但对于Component来说是不需要知道Decorator的存在的。
 * 
 * @author clarck
 * 
 */
public abstract class Decorator extends Component {
    protected Component mComponent;

    public void setComponent(Component component) {
        mComponent = component;
    }
    
    @Override
    public void Operation() {
        if (mComponent != null) {
            mComponent.Operation();
        }
    }

}

	ConcreateDecoratorA类:
package com.cnblog.clarck;

/**
 * 具体的的装饰对象,起到给Component添加职责的作用
 * 
 * @author clarck
 * 
 */
public class ConcreateDecoratorA extends Decorator {
    private String addedState;

    @Override
    public void Operation() {
        super.Operation();
        addedState = "New State";
        System.out.println("具体装饰对象A的操作" + addedState);
    }

}

	ConcreateDecoratorB类:
package com.cnblog.clarck;

/**
 * 具体的装饰类B
 * 
 * @author clarck
 * 
 */
public class ConcreateDecoratorB extends Decorator {

    @Override
    public void Operation() {
        super.Operation();
        addedBehaivor();
        System.out.println("具体装饰对象B");
    }

    private void addedBehaivor() { //用来区别ConcreateDecoratorA
        
    }
}
	测试类:
package com.cnblog.clarck;

/**
 * 测试类
 * 
 * @author clarck
 * 
 */
public class Test {
    public static void main(String[] args) {
        ConcreateComponent component = new ConcreateComponent();
        ConcreateDecoratorA decoratorA = new ConcreateDecoratorA();
        ConcreateDecoratorB decoratorB = new ConcreateDecoratorB();

        decoratorA.setComponent(component);
        decoratorB.setComponent(decoratorA);
        decoratorB.Operation();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值