定义:
指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
使用场景:
- 当需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充时。例如,该类被隐藏或者该类是终极类或者采用继承方式会产生大量的子类。
- 当需要通过对现有的一组基本功能进行排列组合而产生非常多的功能时,采用继承关系很难实现,而采用装饰模式却很好实现。
- 当对象的功能要求可以动态地添加,也可以再动态地撤销时。
主要角色:
- 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
- 具体构件(Concrete Component)角色:实现抽象构件,通过装饰角色为其添加一些职责。
- 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
- 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任
代码:
public class DecoratorPattern
{
public static void main(String[] args)
{
Component p=new ConcreteComponent();
p.operation();
System.out.println("---------------------------------");
Component d=new ConcreteDecorator(p);
d.operation();
}
}
//抽象构件角色
interface Component
{
public void operation();
}
//具体构件角色
class ConcreteComponent implements Component
{
public ConcreteComponent()
{
System.out.println("创建具体构件角色");
}
public void operation()
{
System.out.println("调用具体构件角色的方法operation()");
}
}
//抽象装饰角色
class Decorator implements Component
{
private Component component;
public Decorator(Component component)
{
this.component=component;
}
public void operation()
{
component.operation();
}
}
//具体装饰角色
class ConcreteDecorator extends Decorator
{
public ConcreteDecorator(Component component)
{
super(component);
}
public void operation()
{
super.operation();
addedFunction();
}
public void addedFunction()
{
System.out.println("为具体构件角色增加额外的功能addedFunction()");
}
}
例子:
- 奶茶算钱-奶茶加各种料后算钱。奶茶类有算钱的算法,料也有。他们有相同的动作,算出一个结果,这个时候用装饰者比较好。
- 描述人-
- Component
public interface Person {
void desc();
}
- Concrete Component
package decoration;
/**
* Created by bitsino-001 on 2019/6/20.
* 被装饰类
*/
public class Kobe implements Person {
@Override
public void desc() {
System.out.println("kobe是一个人");
}
}
- Decorator
package decoration;
/**
* Created by bitsino-001 on 2019/6/20.
* 装饰器
*/
public class PersonDecorator implements Person {
/**
* 持有被装饰类,以公共接口接收
*/
Person person;
public PersonDecorator(Person person) {
this.person = person;
}
@Override
public void desc() {
person.desc();
}
}
- ConcreteDecorator
public class HighPerson extends PersonDecorator {
public HighPerson(Person person) {
super(person);
}
@Override
public void desc() {
super.desc();
System.out.println("是一个很高的人");
}
}
public class RichPerson extends PersonDecorator {
public RichPerson(Person person) {
super(person);
}
@Override
public void desc() {
super.desc();
System.out.println("是一个富人");
}
}
public class PrettyPerson extends PersonDecorator {
public PrettyPerson(Person person) {
super(person);
}
@Override
public void desc() {
super.desc();
System.out.println("是一个帅人");
}
}
- 描述他是一个高富帅(很像在创建io流)
person = new PrettyPerson(new RichPerson(new HighPerson(new Kobe())));
IO流
1569493975(1).jpg
网友评论