设计模式之装饰模式

一.模式定义

  • 装饰模式:动态地给一个对象增加一些额外的职责。就扩展功能面言,装饰模式提供了—种比使用子类更加灵活的替代方案。
  • 装饰模式可以在不需要创造更多子类的情况下,将对象的功能扩展。

二.模式结构

1.Componcnt(抽象构件),它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实际的业务方法,它的引入可以使客户以一致的方式处理未被装饰的对象以及装饰之后的对象,实现客户端的透明操作。


2. ConcreteComponent(具体构件),它是抽象构件类的子类,用于定义具体的构件对象,实现了在抽象构件中声明的方法,装饰类可以给它增加额外的职责(方法)。


3. Decorater(抽象装饰类),它也是抽象构件类的子类,用于给具体构件增加职责,但是具体职责通常在其子类中实现,它维护一个指向抽象构件对象的引用,通过该引用可以调用装饰之前构件对象的方法,并通过其子类扩展该方法,以达到装饰的目的。


4.ConcreteDecorator(具体装饰类),它是抽象装饰类的子类,负责向构件添加新的职责,每一个具体装饰类都定义了一些新的行为,它可以调用在抽象装饰类中定义的方法,并且可以增加新的方法,以实现扩展对象的行为。


 

  •  .Componcnt(抽象构件)
public abstract class Component
{
    public abstract void Operation();
}
  • ConcreteComponent(具体构件) ,实现一些基本的功能,即未装饰前应有的业务。
public final class ConcreteComponent extend Component {
    public void Operation()
    {
        System.out.println("基本功能实现");
    }
}
  • Decorater(抽象装饰类),具体装饰类的父类,继承Componcnt(抽象构件),额外业务的具体实现在子类完成,
public abstract class Decorator extends Component {

    private Component component = null;

    //通过构造函数传递给被修饰者
    public Decorator(Component component) {
        this.component = component;
    }

    //委托给被修饰者执行
    @Override
    public void operation() {
        if(component != null) {
            this.component.operation();
        }
    }

}
  • ConcreteDecorator(具体装饰类)
public class ConcreteDecorator extends Decorator {

    //定义被修饰者
    public ConcreteDecoratorA(Component component) {
        super(component);
    }

    //定义自己的修饰方法
    private void method() {
        System.out.println("method 修饰");
    }

    @Override
    public void operation() {
        this.method();
        super.operation();
    }

}

三.适用场景

1. 何时使用

  • 在不想增加很多子类的情况下扩展类时

2. 方法

  • 将具体功能职责划分,同时继承装饰者模式

3. 优点

  • 装饰类和被装饰类可以独立发展,而不会相互耦合。它有效地把类的核心职责和装饰功能分开了
  • 装饰模式是继承关系的一个替代方案
  • 装饰模式可以动态地扩展一个实现类的功能

4. 缺点

  • 多层装饰比较复杂。比如我们现在有很多层装饰,出了问题,一层一层检查,最后发现是最里层的装饰出问题了,想想工作量都害怕

5. 使用场景

  • 需要扩展一个类的功能时
  • 需要动态地给一个对象增加功能,并可以动态地撤销时
  • 需要为一批的兄弟类进行改装或加装功能时

6. 应用实例

  • 旧机包装成新机,手机/电脑内部配件不变,只是换个外壳
  • 换衣小游戏,人还是那个人,不断给她换衣服,还可以一层套一层的
  • 孙悟空有72变,变成什么后就有了它的功能,但本质还是一只猴子

  • 平常当系统需要新功能时,是向旧的类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或主要行为,这种做法的问题在于,它们再主类中加入了新的字段、新的方法和新的逻辑,从而增加了主类的复杂度,而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的个特殊行为的需要。
  • 而装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象。因此当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序的地使用装饰功能包装对象了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值