设计模式:decorator模式
两点:
- 继承同一虚接口,实现数据一致性
- 桥接方式指向被装饰类
目的:在不改变被装饰类功能的前提下增加新功能
特点:继承是子类和父类强耦合,桥接是低耦合
例子:
class Print //抽象接口
{
public:
virtual int getColumns() = 0; //横向
virtual int getRows() = 0; //纵向
virtual string getRowContent(int row) = 0;
virtual void show()
{
for(int i=0; i<getRows(); i++)
{
cout << getRowContent(i) << endl;
}
}
}; class TextPrint: public Print //具体装饰类
{
string content;
public:
TextPrint(string content)
{
this->content = content;
} virtual int getColumns()
{
return content.size();
}; virtual int getRows()
{
return 1;
} virtual string getRowContent(int row)
{
if(row == 0)
{
return content;
}
else
{
return NULL;
}
}
}; class Border: public Print //1.和被装饰物继承自同一接口,实现容器和内容的一致性
{
char ch;
Print* print; //2.指向被装饰物
public:
Border(char ch, Print* print)
{
this->ch = ch;
this->print = print;
} virtual int getColumns()
{
return 1 + print->getColumns() + 1;
}; virtual int getRows()
{
return 1 + print->getRows() + 1;
} virtual string getRowContent(int row)
{ if(row == 0 || row == print->getRows() + 1)
{
string str = "";
for(int i=0; i<getColumns(); i++)
{
str += ch;
} return str;
}
else
{
return ch + print->getRowContent(row -1) + ch;
}
}
};
int main()
{
Border* border = new Border('*', new TextPrint("hello world"));
border->show(); cout << endl; Border* doubleBorder = new Border('+', border);
doubleBorder->show(); cout << endl; Border* trebleBorder = new Border('-', doubleBorder);
trebleBorder->show(); return 0;
} // 打印结果如下:
// *************
// *hello world*
// ************* // +++++++++++++++
// +*************+
// +*hello world*+
// +*************+
// +++++++++++++++ // -----------------
// -+++++++++++++++-
// -+*************+-
// -+*hello world*+-
// -+*************+-
// -+++++++++++++++-
// -----------------
设计模式:decorator模式的更多相关文章
- Java设计模式(7)装饰模式(Decorator模式)
Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这 ...
- 设计模式之——Decorator模式
Decorator模式又叫装饰者模式,这种模式是为了满足Java开发的"面向扩展开放,面向修改闭源"的开发原则设计出来的. 在装饰者模式中,不修改源类的代码,却能修改源类中方法的功 ...
- 设计模式(十二)Decorator模式
Decorator模式就是不断地为对象添加装饰的设计模式.以蛋糕为例,程序中的对象就相当于蛋糕,然后像不断地装饰蛋糕一样地不断地对其增加功能,它就变成了使用目的更加明确的对象. 首先看示例程序的类图. ...
- 常见设计模式的解析和实现(C++)之九—Decorator模式
作用:动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. UML结构图: 抽象基类: 1) Component :定义一个对象接口,可以为这个接口动态地 ...
- [C++设计模式] decorator 装饰者模式
<head first>中 的样例:咖啡店有各种咖啡饮料,能够往咖啡里面加各种调料变成还有一种饮料.假设使用继承的方式来为每一种饮料设计一个类,代码的复杂度非常easy膨胀,并且会继承父类 ...
- 《图解设计模式》读书笔记5-2 decorator模式
目录 代码演示 模式的角色和类图 思路拓展 Decorator模式即装饰器模式,就是对类进行装饰,下面通过代码说明. 代码演示 代码展示的内容 有一个类StringDisplay:表示一句话,比如he ...
- java设计模式 模板方法模式Template Method
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.毫无疑问,设计模式于己 ...
- C++设计模式——代理模式
前言 青春总是那样,逝去了才开始回味:大学生活也是在不经意间就溜走了,现在上班的时候,偶尔还会怀念大学时,大家在一起玩游戏的时光.大学喜欢玩游戏,但是可悲的校园网,速度能把人逼疯了:还好,后来搞了一个 ...
- 举例说, Decorator模式(Decorator Pattern)
前言 在食品工业中的装饰图案具有比较广泛的应用,大多数的两个图案和在网上的例子饮食相关的,一旦被称为电影的手表,点咖啡要加糖要加奶昔要加这加那的时候.感觉好有派~好高大上啊~.为啥我在小卖部都是 ...
- 连载:面向对象的葵花宝典:思维、技能与实践(40) - DECORATOR模式
掌握了道路后,设计模式,我们将以新的方式来理解设计模式,这种方法更简单.更直观.不信?子就知道了 =================================================== ...
随机推荐
- 也来聊聊 HTTPS.
前言: 网上聊 HTTPS 的文章已经数都数不过来了吧,厚着脸皮,整理下读书笔记,结合平常项目的实践,也来聊聊 HTTPS. 一.为什么需要 HTTPS? 众所周知,HTTP 协议具有无连接.不可靠. ...
- Spring Boot Admin 2.1.4最新实战教程
环境的搭建 首先搭建eruka的注册中心 pom.xml <?xml version="1.0" encoding="UTF-8"?> <pr ...
- bug和测试报告思维导图
Bug定义: 1.不符合需求的 2.程序本身的报错 3.不符合用户使用习惯的 Bug生命周期: 当我们测试人员提交一个bug的时候,自始bug就有它的生命周期,从开始到结束, 把测试的过程和结果写成文 ...
- 九、深度优先 && 广度优先
原文地址 一.什么是"搜索"算法? 算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于"图"这种数据结构的. 因为图这种数据结构的表达能 ...
- 入门大数据---SparkSQL外部数据源
一.简介 1.1 多数据源支持 Spark 支持以下六个核心数据源,同时 Spark 社区还提供了多达上百种数据源的读取方式,能够满足绝大部分使用场景. CSV JSON Parquet ORC JD ...
- 【String注解驱动开发】困扰了我很久的AOP嵌套调用终于解决了!
写在前面 最近在分析Spring源码时,在同一个类中写了嵌套的AOP方法,测试时出现:Spring AOP在同一个类里自身方法相互调用时无法拦截.哎,怎么办?还能怎么办呢?继续分析Spring源码,解 ...
- Kali Day1
一.最新版本的Kali Linux的账号名和密码都是kali. 如何切换root 步骤如下: 1. 设置密码 sudo passwd root 2. 切换身份 su 3. 图示 二.快捷键 1. K ...
- python 批量重命名文件
# -*- coding: utf-8 -*- import os import sys def rename(): path = input("路径(例如D:\\\\picture):&q ...
- 如何配置webpack让浏览器自动补全前缀
一.postcss-loader有什么用? PostCSS 本身是一个功能比较单一的工具.它提供了一种方式用 JavaScript 代码来处理 CSS.它负责把 CSS 代码解析成抽象语法树结构(Ab ...
- H5禁止微信内置浏览器调整字体大小
微信webview内置了调整字体大小的功能,用户可以根据实际情况进行调节.但是这也会导致字体大小改变以后,出现页面布局错乱的情况. 1.iOS的解决方案是覆盖掉微信的样式: body { /* IOS ...