装饰器模式

装饰器模式

装饰器模式中主要有两个角色:

  • 装饰器;
  • 被装饰的对象。
    用老王买装备的例子来说,老王就是被装饰的对象,而衣服、裤子、帽子等就是装饰器。

装饰器和被装饰的对象有两个特点,也是装饰器模式的关键:

  • 他们实现同一个接口;
  • 装饰器中使用了被装饰的对象。

使用装饰器模式的几个关键点:

  • 装饰器和被装饰类要实现同一个接口( 实际开发中也可能用继承 )。
  • 装饰器中的方法可以调用被装饰对象提供的方法,以此实现功能累加的效果,例如,夹克装饰器和帽子装饰器中调用了 person.cost() + xx 实现累计消费金额的累加。

实例

public interface Person {
    /**
     * 计算累计消费
     * @return
     */
    public Double cost();
    public void show();
}
/**
 * 抽象的服饰装饰器
 */
public abstract class ClothesDecorator implements Person {
    //装饰器中要使用被装饰器的对象,构造方法中传入
    protected Person person;

    public ClothesDecorator(Person person) {
        this.person = person;
    }
}
/**
 * 被装饰的对象
 */
public class LaoWang implements Person{

    @Override
    public Double cost() {
        return 0.0; //赤果果的时候累计消费为0
    }

    @Override
    public void show() {
        System.out.println("我是赤果果的老王");
    }
}
public class Jacket extends ClothesDecorator {
    public Jacket(Person person) {
        super(person);
    }

    @Override
    public void show() {
        person.show();
        System.out.println("穿上夹克,累计消费" + this.cost());
    }

    @Override
    public Double cost() {
        return person.cost() + 100; //夹克100元
    }
}
public class Hat extends ClothesDecorator {
    public Hat(Person person) {
        super(person);
    }

    @Override
    public void show() {
        //执行已有功能
        person.show();
        //此处是附加的功能
        System.out.println("戴上帽子,累计消费" + this.cost());
    }

    @Override
    public Double cost() {
        return person.cost() + 50; //帽子50元
    }
}

单元测试:

import com.netease.learn.designPattern.decorator.Hat;
import com.netease.learn.designPattern.decorator.Jacket;
import com.netease.learn.designPattern.decorator.LaoWang;
import com.netease.learn.designPattern.decorator.Person;
import org.junit.Test;

public class DecoratorTest {

    @Test
    public void test1() {
        Person laowang = new LaoWang();

        //穿上夹克
        laowang = new Jacket(laowang);

        //戴上帽子
        laowang = new Hat(laowang);

        laowang.show();
        System.out.println("买单,老王总共消费:" + laowang.cost());
    }
}

参考资料

  1. 代码仓库-装饰器模式
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 8.门面模式 8.1.课程目标 1、掌握门面模式和装饰器模式的特征和应用场景 2、理解装饰器模式和代理模式的根本区...
    我是阿喵酱阅读 954评论 0 1
  • 1.初识装饰模式 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更为灵活。 Compone...
    王侦阅读 729评论 0 0
  • 定义 装饰器模式又名包装(Wrapper)模式。装饰器模式以对客户端透明的方式拓展对象的功能,是继承关系的一种替代...
    步积阅读 36,045评论 0 38
  • 装饰器模式 装饰器模式是一种旨在提升代码复用率的结构性模式。有点类似于混入模式,它被认为是一种可以替代子类的可行方...
    pws019阅读 372评论 0 0
  • 在前面相信大家对组合模式已经有了一定的了解,现在我们来继续讲一下装饰器模式。 什么是装饰器模式 装饰模式是通过组合...
    ManyHong阅读 486评论 0 1