设计模式应用场景之Model设计中可以用到的设计模式
![](https://img2018.cnblogs.com/blog/826860/201812/826860-20181222161050337-362138812.png)
![](https://img2018.cnblogs.com/blog/826860/201812/826860-20181222161259867-1690923778.png)
![](https://img2018.cnblogs.com/blog/826860/201812/826860-20181222161710731-1337877816.png)
![](https://img2018.cnblogs.com/blog/826860/201812/826860-20181222161912612-1780319989.png)
代码实现如下:
@protocol Mark <NSObject,NSCopying>
@property (nonatomic, strong) UIColor *color;
@property (nonatomic, assign) CGSize size;
@property (nonatomic, assign) CGPoint location;
- (void)addMark:(id<Mark>)mark;
- (void)removeMark:(id<Mark>)mark;
- (void)removeAllMarks;
- (id<Mark>)childAtIndex:(int)index;
- (id<Mark>)lastChild;
- (NSUInteger)count;
@end
2.Stroke类实现Mark协议如下:
@interface Stroke()
@property (nonatomic, strong) NSMutableArray<id<Mark>> *markArray;
@end @implementation Stroke
@synthesize color,location,size;
#pragma mark - 属性操作
- (void)setLocation:(CGPoint)location {}
- (CGPoint)location {
if (_markArray.count) {
return [[_markArray firstObject] location];
} else {
return CGPointZero;
}
}
#pragma mark - Mark操作
- (NSMutableArray<id<Mark>> *)markArray {
if (!_markArray) {
_markArray = @[].mutableCopy;
}
return _markArray;
} - (void)addMark:(id<Mark>)mark {
[self.markArray addObject:mark];
} - (void)removeMark:(id<Mark>)mark {
//在当前节点中,就从当前节点删除,不在当前节点,就深度查找子节点
if ([_markArray containsObject:mark]) {
[self.markArray removeObject:mark];
} else {
[_markArray makeObjectsPerformSelector:@selector(removeMark:) withObject:mark];
}
} - (void)removeAllMarks {
[self.markArray removeAllObjects];
} - (id<Mark>)childAtIndex:(int)index {
if (self.markArray.count == ) {
return nil;
} else {
return self.markArray[index];
}
} - (id<Mark>)lastChild {
return self.markArray.lastObject;
} - (NSUInteger)count {
return self.markArray.count;
}
@implementation Vertex
@synthesize location;
@dynamic color,size; - (instancetype)initWithLocation:(CGPoint)location {
self = [super init];
if (self) {
self.location = location;
}
return self;
} #pragma mark - 属性操作
- (UIColor *)color{return nil;}
- (void)setColor:(UIColor *)color{}
- (CGSize)size{return CGSizeZero;}
- (void)setSize:(CGSize)size{} #pragma mark - Mark操作
- (void)addMark:(id<Mark>)mark {}
- (void)removeMark:(id<Mark>)mark {}
- (void)removeAllMarks {}
- (id<Mark>)childAtIndex:(int)index {return nil;}
- (id<Mark>)lastChild {return nil;}
- (NSUInteger)count {return ;}
4.Dot类实现Mark协议如下:
@interface Dot : Vertex
@end @implementation Dot
@synthesize color,size;
因为Dot类基础自Vertex,所以对象Mark对象的操作使用父类的就好了
迭代器模式篇
迭代器模式简介:
![](https://img2018.cnblogs.com/blog/826860/201812/826860-20181222162356210-2003771965.png)
简单表示,迭代器持有着聚合对象
![](https://img2018.cnblogs.com/blog/826860/201812/826860-20181222162453155-1169769154.png)
NSEnumerator *enumerator = [self enumerator];
id <Mark> mark;
while (mark = [enumerator nextObject]) {
[mark lastChild]
}
self.stroke = [Stroke new];
[self.stroke enumerateMarksUsingBlock:^(id<Mark> mark, BOOL *stop) { }]
迭代器模式的实际使用例子:
![](https://img2018.cnblogs.com/blog/826860/201812/826860-20181222162803292-688739072.png)
代码实现如下:
Mark协议接口定义
@protocol Mark <NSObject,NSCopying>
@property (nonatomic, strong) UIColor *color;
@property (nonatomic, assign) CGSize size;
@property (nonatomic, assign) CGPoint location;
- (void)addMark:(id<Mark>)mark;
- (void)removeMark:(id<Mark>)mark;
- (void)removeAllMarks;
- (id<Mark>)childAtIndex:(int)index;
- (id<Mark>)lastChild;
- (NSUInteger)count;
- (instancetype)copy;
//迭代器
- (NSEnumerator *)enumerator;
@end;
Stroke类接口实现
@interface Stroke()
@property (nonatomic, strong) NSMutableArray<id<Mark>> *markArray;
@end @implementation Stroke
@synthesize color,location,size;
#pragma mark - 属性操作
- (void)setLocation:(CGPoint)location {}
- (CGPoint)location {
if (_markArray.count) {
return [[_markArray firstObject] location];
} else {
return CGPointZero;
}
}
#pragma mark - Mark操作
- (NSMutableArray<id<Mark>> *)markArray {
if (!_markArray) {
_markArray = @[].mutableCopy;
}
return _markArray;
} - (void)addMark:(id<Mark>)mark {
[self.markArray addObject:mark];
} - (void)removeMark:(id<Mark>)mark {
//在当前节点中,就从当前节点删除,不在当前节点,就深度查找子节点
if ([_markArray containsObject:mark]) {
[self.markArray removeObject:mark];
} else {
[_markArray makeObjectsPerformSelector:@selector(removeMark:) withObject:mark];
}
} - (void)removeAllMarks {
[self.markArray removeAllObjects];
} - (id<Mark>)childAtIndex:(int)index {
if (self.markArray.count == ) {
return nil;
} else {
return self.markArray[index];
}
} - (id<Mark>)lastChild {
return self.markArray.lastObject;
} - (NSUInteger)count {
return self.markArray.count;
} #pragma mark - 迭代器
- (NSEnumerator *)enumerator {
return [[ZHFMarkEnumerator alloc] initWithMark:self];
}
![](https://img2018.cnblogs.com/blog/826860/201812/826860-20181222163100012-839279605.png)
代码实现如下:
@protocol Mark <NSObject,NSCopying>
@property (nonatomic, strong) UIColor *color;
@property (nonatomic, assign) CGSize size;
@property (nonatomic, assign) CGPoint location;
- (void)addMark:(id<Mark>)mark;
- (void)removeMark:(id<Mark>)mark;
- (void)removeAllMarks;
- (id<Mark>)childAtIndex:(int)index;
- (id<Mark>)lastChild;
- (NSUInteger)count;
- (instancetype)copy;
//迭代器
- (NSEnumerator *)enumerator;
//内部迭代器
- (void)enumerateMarksUsingBlock:(void (^) (id <Mark> mark, BOOL *stop))block;
@end;
@interface Stroke()
@property (nonatomic, strong) NSMutableArray<id<Mark>> *markArray;
@end @implementation Stroke
@synthesize color,location,size;
#pragma mark - 属性操作
- (void)setLocation:(CGPoint)location {}
- (CGPoint)location {
if (_markArray.count) {
return [[_markArray firstObject] location];
} else {
return CGPointZero;
}
}
#pragma mark - Mark操作
- (NSMutableArray<id<Mark>> *)markArray {
if (!_markArray) {
_markArray = @[].mutableCopy;
}
return _markArray;
} - (void)addMark:(id<Mark>)mark {
[self.markArray addObject:mark];
} - (void)removeMark:(id<Mark>)mark {
//在当前节点中,就从当前节点删除,不在当前节点,就深度查找子节点
if ([_markArray containsObject:mark]) {
[self.markArray removeObject:mark];
} else {
[_markArray makeObjectsPerformSelector:@selector(removeMark:) withObject:mark];
}
} - (void)removeAllMarks {
[self.markArray removeAllObjects];
} - (id<Mark>)childAtIndex:(int)index {
if (self.markArray.count == ) {
return nil;
} else {
return self.markArray[index];
}
} - (id<Mark>)lastChild {
return self.markArray.lastObject;
} - (NSUInteger)count {
return self.markArray.count;
} #pragma mark - 迭代器
- (NSEnumerator *)enumerator {
return [[ZHFMarkEnumerator alloc] initWithMark:self];
} - (void)enumerateMarksUsingBlock:(void (^)(id<Mark>, BOOL *stop))block {
NSEnumerator *enumerator = [self enumerator];
id <Mark> mark;
BOOL *stop = NO;
for (id <Mark> mark in enumerator) {
block(mark, &stop);
if (stop) {
break;
}
}
}
设计模式应用场景之Model设计中可以用到的设计模式的更多相关文章
- 《Android源代码设计模式解析》读书笔记——Android中你应该知道的设计模式
断断续续的,<Android源代码设计模式解析>也看了一遍.书中提到了非常多的设计模式.可是有部分在开发中见到的几率非常小,所以掌握不了也没有太大影响. 我认为这本书的最大价值有两点,一个 ...
- Model设计中常见的技巧和注意事项
verbose_name 可以作为第一个参数传入,书写更加工整和有序: name = models.CharField('类别名',default="", max_length=3 ...
- 设计模式——如何避免在OO设计中违反依赖倒置原则
1 变量不可以包含具体类的引用.一旦new,就对具体类产生依赖,用工厂模式来避开. 2 类不要派生至具体类.用派生抽象类避开. 3 不要覆盖基类已经实现的方法.基类中已实现的方法应该由所有子类共享.
- [.net 面向对象程序设计深入](13)实战设计模式——设计模式使用场景及原则
[.net 面向对象程序设计深入](13)实战设计模式——设计模式使用场景及原则 1,什么是设计模式? 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计 ...
- 设计模式,Let's “Go”! (中)
* { color: #3e3e3e } body { font-family: "Helvetica Neue", Helvetica, "Hiragino Sans ...
- [.net 面向对象程序设计深入](18)实战设计模式——设计模式使用场景及原则
[.net 面向对象程序设计深入](18)实战设计模式——设计模式使用场景及原则 1,什么是设计模式? 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计 ...
- PHP的设计模式及场景应用介绍
有大量的文章解释什么是设计模式,如何实现设计模式,网络上不需要再写一篇这样的文章.相反,在本文中我们更多的讨论什么时候用和为什么要用,而不是用哪一个和如何使用. 我将会为这些设计模式描绘不同的场景和案 ...
- DDD设计中的Unitwork与DomainEvent如何相容?
最近在开发过程中,遇到了一个场景,甚是棘手,在这里分享一下.希望大家脑洞大开一起来想一下解决思路.鄙人也想了一个方案拿出来和大家一起探讨一下是否合理. 一.简单介绍一下涉及的对象概念 工作单元:维护变 ...
- PHP中常见的五种设计模式
设计模式只是为 Java架构师准备的 — 至少您可能一直这样认为.实际上,设计模式对于每个人都非常有用.如果这些工具不是 “架构太空人” 的专利,那么它们又是什么?为什么说它们在 PHP 应用程序中非 ...
随机推荐
- 购买小米成功 散分mhn
之前,我们都没办法解决近来的寡言,面对越来越少的语言,只能是憋得气闷.却没想后来这么一件事可以解开那个尴尬. 前两天晚上,他被我一次次闪躲去看小说伤害,难受,却还是不想和我争吵什么.后来,偶然的机会让 ...
- C#语言各个版本特性(一)
一.c#版本中添加的功能: C#2.0 泛型 部分类型 匿名方法 迭代器 可空类型 Getter / setter单独可访问性 方法组转换(代表) Co- and Contra-variance fo ...
- kolla 安装
下载 kolla-ansible 和 kolla 源码: git clone http://git.trystack.cn/openstack/kolla-ansible -b stable/quee ...
- 构造函数(JAVA)
构造函数 :是一种特殊的方法,主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中. 特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类 ...
- JavaScript 函数声明,函数表达式,匿名函数的区别,深入理解立即执行函数(function(){…})()
function fnName(){xxxx}; // 函数声明:使用function关键字声明一个函数,在指定一个函数名. //例如:(正常,因为 提升 了函数声明,函数调用可以在函数声明之前) f ...
- 1. Socket网络编程
1. 借助服务器实现小写转大写的程序: 客户端:发送任意小写字母到服务器端. 服务器端:接收小写字母,转为大写,回传给客户端,然后客户端显示到屏幕. #include <stdio.h> ...
- springboot自定义配置文件
前言:如果你一点spring的基础没有,建议你不要学习springboot,至少先有一个spring的项目经验或者自己搭建过spring的项目再学习springboot,这样你会发现在spring中搞 ...
- Bootstrap Modal 关闭时右侧滚动条消失,页面左移的解决方法
问题描述:页面在打开Modal之前右侧有滚动条,Modal关闭之后,body中的class="modal-open"和style="padding-right: 17px ...
- the type initializer for 'system.drawingcore.gdiplus' threw an exception
Centos 7 yum install libgdiplus-devel reboot之后生效 apt install libgdiplus cp /usr/lib/libgdiplus.so ~/ ...
- 2016级算法第六次上机-D.AlvinZH的学霸养成记V
1081 AlvinZH的学霸养成记V 思路 中等题,计算几何. 这是一个排序问题,按极角排序.可以转化为叉积的应用,对于点A和B,通过叉积可以判断角度大小,共线时再判断距离. 叉积的应用.OA × ...