设计模式-结构型模式之装饰者模式(DecoratorPatter

2019-02-28  本文已影响0人  gooddaytoyou

定义

装饰者模式(DecoratorPattern):对客户透明的方式动态地给一个对象附加上更多的责任,装饰者模式相比生成子类可以更灵活地增加功能。

相关角色

解决问题

动态地将责任附加到对象身上,比继承更具有弹性。

UML类图

decorator.png

Component

public interface Component {
    void sampleMethod();
}

Decorator

public class Decorator implements Component {
    private Component component;

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

    @Override
    public void sampleMethod() {
        // 委派给构件
        component.sampleMethod();
    }
}

ConcreteComponent

public class ConcreteComponent implements Component {
    @Override
    public void sampleMethod() {
        System.out.println("I'm ConcreteComponent");
    }
}

ConcreteDecorator

public class ConcreteDecorator extends Decorator {

    public ConcreteDecorator(Component component) {
        super(component);
    }

    @Override
    public void sampleMethod() {
        //写相关的业务代码
        super.sampleMethod();
        addFunction();
    }

    public void addFunction() {
        System.out.println(" add Function ConcreteDecorator");
    }

}

例子

在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类)、AccessoriesPhone(挂件手机类)等,这样就会导致 ”子类爆炸“问题,为了解决这个问题,我们可以使用装饰者模式来动态地给一个对象添加额外的职责。

类图

decorator_phone.png
Phone
public abstract class Phone {
    public abstract void print();
}

Decorator

public abstract class Decorator extends Phone {
    Phone phone;

    public Decorator(Phone phone) {
        this.phone = phone;
    }

    @Override
    public void print() {
        if (phone != null)
            phone.print();
    }
}

XiaoMiPhone

public class XiaoMiPhone extends Phone {

    @Override
    public void print() {
        System.out.println("小米手机");
    }

}

Accessories

public class Accessories extends Decorator {

    public Accessories(Phone phone) {
        super(phone);
    }

    @Override
    public void print() {

        super.print();
        addAccessories();
    }

    public void addAccessories() {
        System.out.println("我是带挂件的手机");
    }

}

优缺点

优点:

缺点:

延伸

使用场景

下面让我们看看装饰者模式具体在哪些情况下使用,在以下情况下应当使用装饰者模式:

相关源码

Design-Model

上一篇 下一篇

猜你喜欢

热点阅读