装饰者模式

1、目标

演示设计模式之装饰者模式。

2、装饰者角色

a、抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。

b、具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。
c、装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
d、具体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任。

3、测试代码

a、接口【充当抽象构件】

package com.wen.interface_;

/**
 * Component【角色a】
 * 
 * @author John_wen
 * @since 2015-1-1
 */
public interface Component {
	/**
	 * 接口规范方法
	 */
	public void doSomething();
}
b、【具体构件】

package com.wen.interface_impl;

import com.wen.interface_.Component;

/**
 * ConcreteComponent【角色b】
 * 
 * @author John_wen
 * @since 2015-1-1
 */
public class ConcreteComponent implements Component {

	@Override
	public void doSomething() {
		System.out.println("我是具体构件角色");
		// TODO 相关业务代码
	}

}
c、装饰基类

package com.wen.interface_impl;

import com.wen.interface_.Component;

public class Decorator implements Component {

	private Component component;

	public Decorator(Component component) {
		this.component = component;
	}

	@Override
	public void doSomething() {
		// 委托给构建
		component.doSomething();
	}

}
d、具体装饰类
package com.wen.test;

import com.wen.interface_.Component;
import com.wen.interface_impl.Decorator;

/**
 * 装饰者A
 * 
 * @author John_wen
 * @since 2015-1-1
 */
public class ConcreteDecoratorA extends Decorator {
	public ConcreteDecoratorA(Component component) {
		super(component);
	}

	@Override
	public void doSomething() {
		 super.doSomething();
		System.out.println("我是装饰者A");
	}
}
package com.wen.test;

import com.wen.interface_.Component;
import com.wen.interface_impl.Decorator;

/**
 * 装饰者B
 * 
 * @author John_wen
 * @since 2015-1-1
 */
public class ConcreteDecoratorB extends Decorator {
	public ConcreteDecoratorB(Component component) {
		super(component);
	}

	@Override
	public void doSomething() {
		super.doSomething();
		System.out.println("我是装饰者B");
	}
}
e、测试类

package com.wen.test;

import org.junit.Test;

import com.wen.interface_.Component;
import com.wen.interface_impl.ConcreteComponent;

public class TestClass {

	@Test
	public void test1() {

		// 1、具体构件类【没有使用装饰者】
		Component concreteComponent = new ConcreteComponent();
		concreteComponent.doSomething();
		System.out.println("-----------------------");
		concreteComponent = new ConcreteDecoratorA(concreteComponent);
		concreteComponent.doSomething();
		System.out.println("-----------------------");
		concreteComponent = new ConcreteDecoratorB(concreteComponent);
		concreteComponent.doSomething();
	}
}
f、测试结果

我是具体构件角色
-----------------------
我是具体构件角色
我是装饰者A
-----------------------
我是具体构件角色
我是装饰者A
我是装饰者B

4、总结

今天学习了一下原始的文件上传;用到了装饰者模式;就顺便看了下装饰者模式;给我感觉的装饰者模式并没有起多大的作用;和java的多态很像;但是感觉又比多态强大灵活;优点:就是功能扩展了不用通过创建更多的子类;只需使用new一个装饰者即可;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值