博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Design Pattern - Decorator
阅读量:6373 次
发布时间:2019-06-23

本文共 1269 字,大约阅读时间需要 4 分钟。

hot3.png

以前对Decorator模式一直印象不深,甚至觉得有点鸡肋.问题是我为什么要用这个模式,难道直接继承不是更直接吗? 简约就是最好的,这个原则适用于所有领域.

的确,这个模式确实好坏参半,最大的优点是对类的职责进行了剥离,使得功能的添加更加层次化,相比一个巨大的类,这个当然看起来不错. 装修的都是附加的功能和基本功能的扩展. 只不过,这样做的代价并不低, 比如产生很多装修类的碎片,增加了功能逻辑的碎片化,装修的时候,也难以很好的隔离原始类,尤其原始类是个庞大的类时,如果不能隔离,这个模式,也就破产. 我到目前为止,没有看到很好的实际应用的例子.

所以只能评价为军训级别(战斗中很少用), 其实我想说鸡肋级别, 不过如果谁有很好的体会,可以讨论,非常想听典型场景.

适用场景:(军训级别)

1. 对单个对象,添加非其核心的修饰性功能,而原对象保持不变

2. 对某个方法进行修改,但是又不方便修改原类.

特点:

要求装修类和原始类同接口,这一点只是出于透明操作的原则.

原始类应该保持简单.

区别:

      Proxy不改变原有功能

      Strategy是行为委托模式, Decorator是结构委托模式.

// Decorator.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include 
using namespace std;class Target{public: virtual void Method(){ cout << "Target method call." << endl; }};class Decorator : public Target{ Target* _component; //Target for decoratingpublic: Decorator(Target* component): _component(component){} virtual void Method(){ _component->Method(); cout << "Im worker for decorating your house." << endl; }};class TargetConcret : public Target{public: virtual void Method(){ cout << "This is new house I just buy." << endl; }};int main(int argc, char* argv[]){ TargetConcret* house = new TargetConcret(); Decorator decorator(house); decorator.Method(); return 0;}

转载于:https://my.oschina.net/zhujinbao/blog/223882

你可能感兴趣的文章
Struts2中dispatcher与redirect的区别
查看>>
zabbix agentd configure
查看>>
地图点聚合优化方案
查看>>
Google Chrome 快捷方式
查看>>
备考PMP心得体会
查看>>
vue proxy匹配规则
查看>>
线上应用故障排查之一:高CPU占用
查看>>
Extend Volume 操作 - 每天5分钟玩转 OpenStack(56)
查看>>
IronPython教程
查看>>
squid via检测转发循环
查看>>
计算分页
查看>>
iptables 做nat路由器脚本
查看>>
数据结构(C语言版)第三章:栈和队列
查看>>
Stopping and/or Restarting an embedded Jetty in...
查看>>
Oracle存储过程中的数据集输入参数
查看>>
vsftp 配置
查看>>
VCSA中配置时间和时区,实测至6.5适用
查看>>
高并发IM系统架构优化实践
查看>>
产品经理教你玩转阿里云负载均衡SLB系列(一):快速入门--什么是负载均衡
查看>>
有关linux--进程组、会话、守护进程详解
查看>>