设计模式(3)-装扮你的类(装饰模式)
时间:2022-05-04
本文章向大家介绍设计模式(3)-装扮你的类(装饰模式),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
首先看看书上的例子吧!人穿衣服的例子!
类图就不画了,就是简单的类结构。
代码如下:
#include <iostream>
using namespace std;
class person{
private:
string name;
public:
person(string name){
this->name = name;
}
void wearTShirts(){
cout<<"大T恤"<<endl;
}
void wearBigTrouser(){
cout<<"跨裤"<<endl;
}
void wearSneakers(){
cout<<"破球鞋"<<endl;
}
void wearSuit(){
cout<<"西装"<<endl;
}
void wearTie(){
cout<<"领带"<<endl;
}
void wearLeatherShoes(){
cout<<"皮鞋"<<endl;
}
void show(){
cout<<"装扮的"<<name.c_str()<<endl;
}
};
int main(int argc, char* argv[])
{
person* p = new person("小张");
cout<<"第一种装扮"<<endl;
p->wearLeatherShoes();
p->wearSuit();
p->wearBigTrouser();
p->show();
cout<<"第二种装扮"<<endl;
p->wearLeatherShoes();
p->wearTShirts();
p->wearSneakers();
p->show();
return 0;
}
如果要新添加一种装扮,那么就需要修改person类的结构,这样就违反了开闭原则
那就先做抽象好了,把变化的抽象出来,于是类图结构如下
对应这个实现上面的程序,好像是方便了一些,但是如果继续增加需求呢?就会出现很多的子类。
从而引出装饰模式
装饰模式是动态的给对象增加一些属性和职责
类结构如下
Componment是定义的一个对象接口,可以给这些对象动态的添加职责
ConcertComponent是要被装饰的对象,即原始对象
Dectorator是装饰抽象类
ConcertDectoratorA和ConcertDectoratorB是具体的装饰对象。
看看原来的类图修改如下
这样,就可以实现对人对象的动态装载,不过,这个例子举得感觉不是很好,没有列出装饰模式的精髓。
- VMware Fusion DHCP方式下如何指定虚拟机IP地址
- Visual Studio 2015正式发布
- 科技巨头纷纷入局 医疗人工智能需要奋起直追?
- Windows PowerShell 工具
- 游戏开发之在UE4中编写C++代码控制角色
- Visual Studio 64位应用程序编译
- Windows 7 上安装Visual Studio 2015 失败解决方案
- Silverlight调用本机exe程序
- 游戏开发之UE4添加角色到场景中
- 人工智能取代人类?高通副总裁这样说
- Disque:Redis之父新开源的分布式内存作业队列
- mac OS X Yosemite 上编译hadoop 2.6.0/2.7.0及TEZ 0.5.2/0.7.0 注意事项
- EasyStack郭长波连任OpenStack基金会独立董事
- VMware Fusion 中如何复制centos/linux虚拟机
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用 Docker Multi-stage 高效构建镜像
- vue(typescript) 使用webpack-bundle-analyzer
- 2020年学习Python-爬取百度图片
- 自动化运维 | Ansible lookup
- 【TBase开源版测评】Hello, TBase
- linux定位问题常用命令
- 聊聊claudb的zset command
- 腾讯云语音识别v1签名算法详解
- MySQL案例:关于JSON的一个bug
- Confluence 如何查看页面树
- 聊聊claudb的pubsub command
- Nginx证书和Tomcat证书能相互转化吗,请看这里
- 你真的理解 Webpack?请回答下列问题
- docker浅入深出3
- 绘图代码|多组学数据可视化的高端玩法