美文网首页
设计模式-结构型模式之装饰者模式(DecoratorPatter

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

作者: gooddaytoyou | 来源:发表于2019-02-28 14:21 被阅读0次

定义

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

相关角色

  • 抽象构件(Component)角色:给出一个抽象接口,以规范准备接受附加责任的对象;
  • 具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类;
  • 装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口;
  • 具体装饰(ConcreteDecorator)角色:负责给构件对象 ”贴上“附加的责任。

解决问题

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

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

相关文章

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

    定义 装饰者模式(DecoratorPattern):对客户透明的方式动态地给一个对象附加上更多的责任,装饰者模式...

  • JavaScript 设计模式核⼼原理与应⽤实践 之 结构型设计

    JavaScript 设计模式核⼼原理与应⽤实践 之 结构型设计模式 装饰器模式,又名装饰者模式。它的定义是“在不...

  • JavaScript设计模式

    设计模式分类(23种设计模式) 创建型单例模式原型模式工厂模式抽象工厂模式建造者模式 结构型适配器模式装饰器模式代...

  • 常用的设计模式

    设计模式主要大概分成三类: 1.创建型:单例设计模式、抽象工厂设计模式 2.结构型:MVC 模式、装饰器模式、适配...

  • 设计模式之装饰器模式

    也称装饰者模式、装饰器模式、Wrapper、Decorator。 装饰模式是一种结构型设计模式,允许你通过将对象放...

  • 设计模式分类汇总

    结构型 适配器模式 组合模式 桥接模式 代理模式 装饰者模式 门面模式 享元模式 行为型 责任链模式 命令模式 解...

  • iOS常用设计模式总结(一)

    设计模式大概分成三类: 1.创建型:单例设计模式、抽象工厂设计模式 2.结构型:MVC 模式、装饰器模式、适配器模...

  • 23种设计模式

    创建型 工厂模式 ( 工厂方法模式, 抽象工厂模式, 建造者模式 ) 单例模式 原型模式 结构型 适配器模式 装饰...

  • java23种设计模式

    创建型 抽象工厂模式工厂方法建造者模式原型模式单态模式 结构型 适配器模式桥接模式组合模式外观模式装饰者模式享元模...

  • 设计模式(1)工厂模式

    设计模式有 23 种,按大类分的化可以分为三类 创建型(如:工厂模式、单例模式、原型模式等) 结构模式型(如:装饰...

网友评论

      本文标题:设计模式-结构型模式之装饰者模式(DecoratorPatter

      本文链接:https://www.haomeiwen.com/subject/qvuxuqtx.html