1. 模板方法模式

模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变一个算法的结构即可重定义该算法的某些特定步骤。

比如说,小时候数学老师的随堂检测,都是在黑板上抄题目,要我们先抄题目,然后再做答案,有时候没看清就会把题目抄错,这就意味着,即使做得再好,也不会正确了。

题目抄错了,那就不是考试题目了,而考试试卷最大的好处就是大家题目都一样,比如说选择题或者判断题,大家都是ABCD或者打钩打叉,非对即错的结果。这其实可以引申出来一个设计模式。

抄题目的代码,版本一:

#import <Foundation/Foundation.h>

@interface ZYTestPaperA : NSObject
@property (nonatomic, copy) NSString *name; - (void)testQuestion1;
- (void)testQuestion2;
@end #import "ZYTestPaperA.h" @implementation ZYTestPaperA - (void)testQuestion1
{
NSLog(@"%@: “大煮干丝”是哪个菜系的代表菜之一( )。\n A四川菜系 B山东菜系 C广东菜系 D淮扬菜系",self.name);
}
- (void)testQuestion2
{
NSLog(@"%@: 红茶属于( )茶。\n A半发酵 B发酵 C不发酵 D微发酵",self.name);
} @end
#import <Foundation/Foundation.h>

@interface ZYTestPaperB : NSObject
@property (nonatomic, copy) NSString *name; - (void)testQuestion1;
- (void)testQuestion2;
@end #import "ZYTestPaperB.h" @implementation ZYTestPaperB
- (void)testQuestion1
{
NSLog(@"%@: “大煮干丝”是哪个菜系的代表菜之一( )。\n A四川菜系 B山东菜系 C广东菜系 D淮扬菜系",self.name);
}
- (void)testQuestion2
{
NSLog(@"%@: 红茶属于( )茶。\n A半发酵 B发酵 C不发酵 D微发酵",self.name);
}
@end

viewController里面的代码:

#import "ViewController.h"
#import "ZYTestPaperA.h"
#import "ZYTestPaperB.h"
@interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; ZYTestPaperA *paperA = [[ZYTestPaperA alloc] init];
paperA.name = @"Joke";
[paperA testQuestion1];
[paperA testQuestion2]; ZYTestPaperB *paperB = [[ZYTestPaperB alloc] init];
paperB.name = @"Jom";
[paperB testQuestion1];
[paperB testQuestion2];
}
@end

上面的代码,很容易就可以发现问题,两张试卷,除了答案不同,其他几乎都相似,像上面那样写,既麻烦、又容易出错,也不易维护。

如果老师突然要改题目,那么两个人就都需要改代码,如果某人抄写错误,那就是很糟糕的一种体验了。

老师出一份题目,打印多份,让学生填写答案就可以了,在这里应该就是试题和答案分享,抽出一个父类,让两个子类继承它,公共的试题代码写到父类中就可以了。

如此,有下面的代码:

#import <Foundation/Foundation.h>

@interface ZYTestPaper : NSObject
@property (nonatomic, copy) NSString *name; - (void)testQuestion1;
- (void)testQuestion2;
@end #import "ZYTestPaper.h" @implementation ZYTestPaper
- (void)testQuestion1
{
NSLog(@"%@: “大煮干丝”是哪个菜系的代表菜之一( )。\n A四川菜系 B山东菜系 C广东菜系 D淮扬菜系",self.name);
}
- (void)testQuestion2
{
NSLog(@"%@: 红茶属于( )茶。\n A半发酵 B发酵 C不发酵 D微发酵",self.name);
}
@end
#import <Foundation/Foundation.h>
#import "ZYTestPaper.h" @interface ZYTestPaperA : ZYTestPaper @end #import "ZYTestPaperA.h" @implementation ZYTestPaperA
- (void)testQuestion1
{
[super testQuestion1]; NSLog(@"答案是B");
} - (void)testQuestion2
{
[super testQuestion2]; NSLog(@"答案是C");
}
@end
#import <Foundation/Foundation.h>
#import "ZYTestPaper.h"
@interface ZYTestPaperB : ZYTestPaper @end #import "ZYTestPaperB.h" @implementation ZYTestPaperB
- (void)testQuestion1
{
[super testQuestion1]; NSLog(@"答案是B");
} - (void)testQuestion2
{
[super testQuestion2]; NSLog(@"答案是C");
}
@end

我们既然用了类的继承,并且肯定这个继承有意义,就应该要成为子类的模板,所有重复的代码都应该要上升到父类里面去,而不是让每个子类都去重复。

当我们要完成在某一细节层次一致的某一个过程或者一系列的步骤,但其个别步骤在更详细的实现上不同时,我们通常考虑用模板方法模式来处理。

简单的说,模板方法模式,是通过将不变的行为移动到父类中去,然后去除子类中的重复代码来体现它的优势,它提供了一个很好的代码复用平台。

当不变的和可变的行为在方法的子类实现中混合到一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式将这些行为搬移到单一的地方,这样就帮助子类摆脱了重复的不变行为的纠缠。

2. 迪米特法则

迪米特法则,也叫最少知识原则:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

迪米特法则首先强调的前提是,在类的结构设计上,每一个类都应当尽量降低成员的访问权限。也就是说,一个类包装好自己的private状态,不需要让别的类知道的字段或者行为就不要公开,需要公开的字段,就用属性来体现。

迪米特法则根本思想,是强调了类的松耦合。类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。

设计模式之模板方法模式&&迪米特法则(代码Objective-C展示)的更多相关文章

  1. 折腾Java设计模式之模板方法模式

    博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...

  2. 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)

    原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...

  3. Python笔记:设计模式之模板方法模式

    此模式通过一个模板方法来定义程序的框架或算法,通常模板方法定义在基类中,即原始的模板,然后子类就可以根据不同的需要实现或重写模板方法中的某些算法步骤或者框架的某部分,最后达到使用相同模板实现不同功能的 ...

  4. js设计模式——6.模板方法模式与职责链模式

    js设计模式——6.模板方法模式与职责链模式 职责链模式

  5. Java设计模式之模板方法模式(Template Method)

    一.含义 定义一个算法中的操作框架,而将一些步骤延迟到子类中.使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤,不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现. 二 ...

  6. PHP设计模式之模板方法模式

    模板方法模式,也是我们经常会在不经意间有会用到的模式之一.这个模式是对继承的最好诠释.当子类中有重复的动作时,将他们提取出来,放在父类中进行统一的处理,这就是模板方法模式的最简单通俗的解释.就像我们平 ...

  7. java设计模式之模板方法模式

    模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...

  8. Head First 设计模式 --8 模板方法模式 别找我,我会找你

    模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤.设计原则:1.封装变化2.多用组合少用集成3.针对接口变 ...

  9. C#设计模式(14)——模板方法模式(Template Method)

    一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...

随机推荐

  1. java 实现唯一ID生成器

      2014-11-08 内容存档在evernote,笔记名"java 实现唯一ID生成器"

  2. HDU 4632 Palindrome subsequence (区间DP)

    Palindrome subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65535 K (Java/ ...

  3. hashCode和identityHashCode 的关系

    1:首先看一下JDk API的观点 1-1:hashCode方法相关 1-2:identityHashCode()方法相关 2:此例的核心程序,对应的观点在注释中已经有所说明,请自己也动手实验一下看看 ...

  4. 【Algorithm】二分查找

    今天在学习<编程之美>的时候,看到一个二分查找的题目,发现原来我真的不懂二分查找. 二分查找时候注意的事项: 在求二分查找的中间点时没有使用 midIndex = (minIndex + ...

  5. scala+hadoop+spark环境搭建

    一.JDK环境构建 在指定用户的根目录下编辑.bashrc文件,添加如下部分: # .bashrc # Source global definitions if [ -f /etc/bashrc ]; ...

  6. 一步一步掌握java的线程机制(二)----Thread的生命周期

    之前讲到Thread的创建,那是Thread生命周期的第一步,其后就是通过start()方法来启动Thread,它会执行一些内部的管理工作然后调用Thread的run()方法,此时该Thread就是a ...

  7. Linux内核系统体系概述

    Linux 内核主要由 5 个模块构成,它们分别是: 进程调度模块 用来负责控制进程对 CPU 资源的使用.所采取的调度策略是各进程能够公平合理地访问 CPU,同时保证内核能及时地执行硬件操作. 内存 ...

  8. Github emoji 表情包大全

    传送门:https://www.jianshu.com/p/72a4214764e4 https://www.webpagefx.com/tools/emoji-cheat-sheet/

  9. python中decode和encode的区别

    #-*-coding:utf-8 import sys ''' *首先要搞清楚,字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码, 即先将 ...

  10. [转]cubemap soft shadow

    https://community.arm.com/graphics/b/blog/posts/dynamic-soft-shadows-based-on-local-cubemap