设计模式之装饰者模式

简介: 设计模式之装饰者模式

介绍


装饰者提供比继承更有弹性的替代方案。 装饰者用用于包装同接口的对象,不仅允许你向方法添加行为,而且还可以将方法设置成原始对象调用(例如装饰者的构造函数)。

装饰者用于通过重载方法的形式添加新功能,该模式可以在被装饰者前面或者后面加上自己的行为以达到特定的目的。


正文


Macbook() {
    .cost = () {
        1000;
    };
}
Memory(macbook) {
    .cost = () {
        macbook.cost() + 75;
    };
}
BlurayDrive(macbook) {
    .cost = () {
        macbook.cost() + 300;
    };
}Insurance(macbook) {
    .cost = () {
        macbook.cost() + 250;
    };
}
myMacbook = Insurance(BlurayDrive(Memory(Macbook())));
console.log(myMacbook.cost());

那么装饰者模式有什么好处呢?前面说了,装饰者是一种实现继承的替代方案。当脚本运行时,在子类中增加行为会影响原有类所有的实例,而装饰者却不然。取而代之的是它能给不同对象各自添加新行为。如下代码所示:

function ConcreteClass() {
    this.performTask = function () {
        this.preTask();
        console.log('doing something');
        this.postTask();
    };
}
function AbstractDecorator(decorated) {
    this.performTask = function () {
        decorated.performTask();
    };
}
function ConcreteDecoratorClass(decorated) {
    this.base = AbstractDecorator;
    this.base(decorated);
    decorated.preTask = function () {
        console.log('pre-calling..');
    };
    decorated.postTask = function () {
        console.log('post-calling..');
    };
}
var concrete = new ConcreteClass();
var decorator1 = new ConcreteDecoratorClass(concrete);
var decorator2 = new ConcreteDecoratorClass(decorator1);decorator2.performTask();

下面是另一个实例,当我们在装饰者对象上调用performTask时,它不仅具有一些装饰者的行为,同时也调用了下层对象的performTask函数。

ConcreteClass() {
    .performTask = () {
        .preTask();
        console.log('doing something');
        .postTask();
    };}AbstractDecorator(decorated) {
    .performTask = () {
        decorated.performTask();
    };}ConcreteDecoratorClass(decorated) {
    .base = AbstractDecorator;
    .base(decorated);
    decorated.preTask = () {
        console.log('pre-calling..');
    };
    .postTask = () {
        console.log('post-calling..');
    };}concrete = ConcreteClass();decorator1 = ConcreteDecoratorClass(concrete);decorator2 = ConcreteDecoratorClass(decorator1);decorator2.performTask();

再来一个彻底的例子:

var tree = {};tree.decorate = function () {
    console.log('Make sure the tree won\'t fall');
};
tree.getDecorator = function (deco) {
    tree[deco].prototype = this;    return new tree[deco];
};
tree.RedBalls = function () {    this.decorate = function () {        this.RedBalls.prototype.decorate(); 
       // 第7步:先执行原型(这时候是Angel了)的decorate方法
        console.log('Put on some red balls');
        // 第8步 再输出 red
        // 将这2步作为RedBalls的decorate方法
    }
};
tree.BlueBalls = function () {    this.decorate = function () {        this.BlueBalls.prototype.decorate(); 
        // 第1步:先执行原型的decorate方法,也就是tree.decorate()
        console.log('Add blue balls'); 
         // 第2步 再输出blue
        // 将这2步作为BlueBalls的decorate方法
    }};tree.Angel = function () {    this.decorate = function () {        this.Angel.prototype.decorate(); 
      // 第4步:先执行原型(这时候是BlueBalls了)的decorate方法
        console.log('An angel on the top');
        // 第5步 再输出angel
        // 将这2步作为Angel的decorate方法
    }
};
tree = tree.getDecorator('BlueBalls'); 
// 第3步:将BlueBalls对象赋给tree,这时候父原型里的getDecorator依然可用
tree = tree.getDecorator('Angel'); 
// 第6步:将Angel对象赋给tree,这时候父原型的父原型里的getDecorator依然可用
tree = tree.getDecorator('RedBalls');
 // 第9步:将RedBalls对象赋给tree
tree.decorate(); 
 // 第10步:执行RedBalls对象的decorate方法


总结


装饰者模式是为已有功能动态地添加更多功能的一种方式,把每个要装饰的功能放在单独的函数里,然后用该函数包装所要装饰的已有函数对象,因此,当需要执行特殊行为的时候,调用代码就可以根据需要有选择地、按顺序地使用装饰功能来包装对象。优点是把类(函数)的核心职责和装饰功能区分开了。


目录
相关文章
|
6月前
|
设计模式 Java
Java设计模式【十】:装饰者模式
Java设计模式【十】:装饰者模式
50 0
|
11天前
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
|
25天前
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
39 0
|
1月前
|
设计模式 Java Kotlin
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
26 0
|
1月前
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
22 0
|
5月前
|
设计模式 Java API
程序技术好文:设计模式:装饰者模式
程序技术好文:设计模式:装饰者模式
25 0
|
6月前
|
设计模式 Java
【设计模式系列笔记】装饰者模式
装饰者模式是一种结构型设计模式,它允许你通过将对象放入包含行为的特殊封装类中来为原始对象添加新的行为。这种模式可以动态地将责任附加到对象上,而不影响其它对象。
70 11
|
6月前
|
设计模式 缓存 安全
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
|
设计模式
23种设计模式_MODE08装饰者模式_手写代码实现
23种设计模式_MODE08装饰者模式_手写代码实现
|
6月前
|
设计模式
【设计模式】装饰者模式
【设计模式】装饰者模式

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    43
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    54
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    62
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    57
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    41
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    106
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78