iOS开发-装饰模式
装饰模式是指在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。通过创建一个包装对象,也就是装饰来包裹真实的对象。装饰模式中的装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互,同时装饰对象包含一个真实对象的引用(reference),装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。 装饰模式与继承都可以要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。 通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。
基础设计
单纯的看概念有点单调,看一张经典的装饰模式的UML类图:

Component:定义ConcreteComponent和Decorator类要实现的方法,装饰对象和真实对象的之间的通信就是通过Component实现;
ConcreteComponent:真实对象,使用ConcreteComponent的派生类提供核心功能,与Decorator是同一级别;
Decorator:具有特定装饰功能的类,用来装饰ConcreteComponent类,具体的装饰子类通过继承Decorator实现;
关于整体的轮廓有了一个大概的了解,我们可以通过生活的例子来模拟装饰模式,关于房子,有商业住宅和民用住宅,买了房子我们需要装修,桌子,椅子必不可少,我们最终需要算一下总费用,思考几秒可以看下面具体实现;
功能实现
设计基础类House和协议:
@protocol HouseDelegate <NSObject> @optional
-(double)totalMoney; @end @interface House : NSObject<HouseDelegate> -(NSString *)detialInfo; @end
House的子类CommercialHouse,被装饰对象:
@implementation CommercialHouse
-(double)totalMoney{
return 360000.89;
}
-(NSString *)detialInfo{
return [NSString stringWithFormat:@"商业住宅"];
}
@end
装饰对象的基类HouseDecorator,这里需要保持一个对被装饰对象的引用:
@interface HouseDecorator : House -(instancetype)initWithHouse:(House *)house; @property (strong,nonatomic) House *house; @end
@implementation HouseDecorator
-(instancetype)initWithHouse:(House *)house{
self=[super init];
if (self) {
self.house=house;
}
return self;
}
@end
装饰对象TableDecorator:
@implementation TableDecorator
-(double)totalMoney{
return self.house.totalMoney+10;
}
-(NSString *)detialInfo{
return [NSString stringWithFormat:@"%@--桌子",self.house.detialInfo];
}
@end
装饰对象ChairDecorator:
@implementation ChairDecorator
-(double)totalMoney{
return self.house.totalMoney+100;
}
-(NSString *)detialInfo{
return [NSString stringWithFormat:@"%@--椅子",self.house.detialInfo];
}
@end
回到最初的总费用问题,我们看下结果:
House *house=[[CommercialHouse alloc]init];
house=[[TableDecorator alloc]initWithHouse:house];
house=[[ChairDecorator alloc]initWithHouse:house];
NSLog(@"房子价格:%f", [house totalMoney]);
NSLog(@"房子详情:%@",[house detialInfo]);
NSLog(@"博客园-FlyElephant");
NSLog(@"http://www.cnblogs.com/xiaofeixiang/");

桌子椅子的价格是可以动态变化的,桌子椅子的数量的也是不确定的,从这些角度看例子稍微有点勉强,不过大概功能设计实现大同小异,万变不离其宗,相信大家会对装饰模式有自己独到的见解~
iOS开发-装饰模式的更多相关文章
- iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
- iOS开发系列--打造自己的“美图秀秀”
--绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz ...
- iOS开发之再探多线程编程:Grand Central Dispatch详解
Swift3.0相关代码已在github上更新.之前关于iOS开发多线程的内容发布过一篇博客,其中介绍了NSThread.操作队列以及GCD,介绍的不够深入.今天就以GCD为主题来全面的总结一下GCD ...
- 总结iOS开发中的断点续传那些事儿
前言 断点续传概述 断点续传就是从文件赏赐中断的地方重新开始下载或者上传数据,而不是从头文件开始.当下载大文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主动的暂停,都会从头下载,这样很 ...
- iOS开发系列文章(持续更新……)
iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...
- iOS开发系列--App扩展开发
概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...
- iOS开发系列--Swift进阶
概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总
--系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...
- iOS开发系列--通知与消息机制
概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...
随机推荐
- Luogu P4944 【PION贪吃蛇】
简单模拟题 用一个数据结构存储这条蛇 考虑蛇的移动 1,如果死了,就把整个蛇清空,所有位置标记为食物 2,如果吃了东西,把这个位置更新为蛇头 3,如果正常走路,这个位置设为蛇头,同时删掉尾巴 蛇的存储 ...
- poj3067 二维偏序树状数组
题解是直接对一维升序排列,然后计算有树状数组中比二维小的点即可 但是对二维降序排列为什么不信呢?? /* */ #include<iostream> #include<cstring ...
- cf276E 两棵线段树分别维护dfs序和bfs序,好题回头再做
搞了一晚上,错了,以后回头再来看 /* 对于每次更新,先处理其儿子方向,再处理其父亲方向 处理父亲方向时无法达到根,那么直接更新 如果能达到根,那么到兄弟链中去更新,使用bfs序 最后,查询结点v的结 ...
- python 全栈开发,Day28(复习,os模块,导入模块import和from)
一.复习 collections 增加了一些扩展数据类型 :namedtuple orderdict defaltdict队列和栈time 时间 三种格式 : 时间戳 结构化 字符串random 随机 ...
- 用函数打印Hello js
<script> function sayHello() { document.write("Hello js!"); } sayHello(); </scrip ...
- ***腾讯云直播(含微信小程序直播)研究资料汇总-原创
这段时间抽空研究了下直播技术,综合比较了下腾讯云直播的技术和文档方面最齐全,现把一些技术资料和文档归集如下: 1.微信小程序移动直播入门导读 https://cloud.tencent.com/doc ...
- python算法双指针问题:两个有序数组的合并
最近在看<你也能看得懂的python算法书>, 自己来实现一下里面的算法吧. 有书里的有所不同. 比如这个题目,我的实现如下: from django.test import TestCa ...
- 【Java】 剑指offer(20) 表示数值的字符串
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如, ...
- POI搜索简介
用户输入——用户输出-----------------------------------------------------------而POI搜索引擎,需要做的就是拿到输入条件,给出用户比较满意的 ...
- angular中使用代理
使用代理 1.在跟目录创建proxy.config.json文件 { "/api": { "target": "http://localhost:30 ...