iOS架构师_认识设计模式

1.什么是设计模式?

概念:为解决特定场景下的问题而定制的解决方案

这里写图片描述

2.设计模式的基本原则

这里写图片描述

这里写图片描述

接口隔离原则:

接口里面只做必要的事情,不做其他相关的事情

需求:封装创建一个Button,但是按钮的尺寸由我自己控制

创建一个baseView

BaseView.h

#import <UIKit/UIKit.h>

@interface BaseView : UIView

/** 自定义按钮  **/
@property(nonatomic,strong)UIButton * btnPrint;

//接口隔离原则:接口里面只做必要的事情,不做其他相关的事情
-(void)changeBtnFrame:(CGRect)frame;

//违背了接口隔离原则
-(void)changeBtnFrame:(CGRect)frame backgroundColor:(UIColor *)backgroundColor;

@end

BaseView.m

#import "BaseView.h"

@implementation BaseView

//接口隔离原则:接口里面只做必要的事情,不做其他相关的事情
-(void)changeBtnFrame:(CGRect)frame{
    self.btnPrint = [[UIButton alloc]initWithFrame:frame];

    [self.btnPrint setTitle:@"print" forState:UIControlStateNormal];

    [self.btnPrint setTitleColor:[UIColor blueColor] forState:UIControlStateHighlighted];

    [self.btnPrint setBackgroundColor:[UIColor redColor]];

    [self.btnPrint addTarget:self action:@selector(onPrintClicks) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:self.btnPrint];
}

-(void)onPrintClicks{
    NSLog(@"采集打印的事件");
}
//抛开接口隔离原则不谈:抽象方法(声明了这个方法,但是不实现)
-(void)changeBtnFrame:(CGRect)frame backgroundColor:(UIColor *)backgroundColor{

}

@end

开闭原则:

对模块拓展开放,对修改关闭。.m文件实现代码不改变。
是比较理想的状态,在实际开发中很难去遵守。

需求:封装创建一个Button,但是按钮的尺寸由我自己控制
增加需求:不但能自己控制尺寸,还要能修改title

根据需求的增加,我们肯定不能在baseView上面新增功能,因为这样就违背了接口隔离原则了,那么我们怎么办呢?

创建一个firstView,继承自baseView

FirstView.h文件

#import "BaseView.h"
@interface FirstView : BaseView
/** 添加字符串  **/
@property(nonatomic,copy)NSString * string;

/* 设置按钮的文字 */
-(void)changeBtnFrame:(CGRect)frame title:(NSString *)title;
@end

里氏替换原则:

1.子类可以实现父类的抽象方法但不能覆盖父类的非抽象方法
2.子类可以增加自己特有的方法

跟多肽类似,多肽:重写父类的方法

里氏替换原则要求父类提供尽可能多的接口,尽可能把所有的情况都考虑到,这个原则是和接口隔离原则想背离的,不可能完全满足里氏替换原则和接口隔离原则。这就尴尬了。。。

我们修改baseView,把firstView中的方法,放到baseView中,忽略firstView

需求更改为:封装创建一个Button,但是按钮的尺寸由我自己控制,能修改title,修改backgroundColor

BaseView.h

#import <UIKit/UIKit.h>

@interface BaseView : UIView

/** 自定义按钮  **/
@property(nonatomic,strong)UIButton * btnPrint;

//接口隔离原则:接口里面只做必要的事情,不做其他相关的事情
-(void)changeBtnFrame:(CGRect)frame;

//违背了接口隔离原则
-(void)changeBtnFrame:(CGRect)frame backgroundColor:(UIColor *)backgroundColor;

/* 设置按钮的文字 这是原来在firstView中定义的方法*/
-(void)changeBtnFrame:(CGRect)frame title:(NSString *)title;

@end

创建一个secondView,继承自baseView

secondView.h

#import "BaseView.h"

@interface SecondView : BaseView

@end

secondView.m

#import "SecondView.h"

@implementation SecondView

-(void)changeBtnFrame:(CGRect)frame backgroundColor:(UIColor *)backgroundColor{

}

-(void)changeBtnFrame:(CGRect)frame title:(NSString *)title{
    self.btnPrint = [[UIButton alloc]initWithFrame:frame];

    [self.btnPrint setTitle:title forState:UIControlStateNormal];

    [self.btnPrint setTitleColor:[UIColor blueColor] forState:UIControlStateHighlighted];

    [self.btnPrint setBackgroundColor:[UIColor redColor]];

    [self.btnPrint addTarget:self action:@selector(onPrintClicks) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:self.btnPrint];
}

//依赖倒转原则
-(void)onPrintClicks{
    [self printString];
}

-(void)printString{
    NSLog(@"这里实现了打印文字的需求");
}
@end

这样就遵循了里氏替换原则,注意和多肽是有区别的:
里氏替换原则:尽量不要重写父类本身实现的逻辑。

依赖倒转原则:

抽象不依赖于细节,细节依赖于抽象(一般指的是接口)

//依赖倒转原则
-(void)onPrintClicks{
    [self printString];
}

-(void)printString{
    NSLog(@"这里实现了打印文字的需求");
}

合成/聚合复用原则

需要从一个类拓展出另外一种方法,尽量不要使用继承,使用新的方法

新建继承自UIView的ButtonView

ButtonView.h文件

#import <UIKit/UIKit.h>
//#import "BaseView.h"
#import "SecondView.h"

@interface ButtonView : UIView

/** 设置属性  **/
@property(nonatomic,strong)SecondView * secondView;

//设置按钮的图片
-(void)changeBtnFrame:(CGRect)frame backgroundImage:(UIImage *)image;

@end

ButtonView.m

#import "ButtonView.h"

@implementation ButtonView

-(void)changeBtnFrame:(CGRect)frame backgroundImage:(UIImage *)image{
    //编写secondView的相关代码
}

@end

最小知识原则:

两个类没有彼此直接通信,而是使用另一个类来通信

这里写图片描述

单一职责原则:

一个类只负责一个功能领域(例子:一个登陆的model,只负责登陆模块的数据)

3.设计模式的类型

1.GOF设计模式
2.结构型设计模式
3.框架级别的行为型设计模式

23种设计模式的分类

1.创建型模式:5种
包含:单例模式,抽象工厂模式,建造者模式,原型模式,工厂模式

2.结构型设计模式:7种
包含:代理模式,组合模式,桥接模式,享元模式,外观模式,装饰模式,适配器模式

3.框架级别的行为型设计模式:11种

包含:观察者模式,访问者模式,中介者模式,解释器模式,策略模式,迭代器模式,命令模式,状态模式,备忘录模式,模板方法模式,责任链模式

这里写图片描述

由很多设计模式构成的复合型设计模式

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、 IOS设计模式的六大设计原则之单一职责原则(SRP,Single Responsibility Principle) 定义   就一个类而言,应该仅有一个引起它变化的原因。 定义解读   这是六大原则中最简单的一种,通俗点说,就是不存在多个原因使得一个类发生变化,也就是一个类只负责一种职责的工作。 优点 类的复杂度降低,一个类只负责一个功能,其逻辑要比负责多项功能简单的多; 类的可读性增强,阅读起来轻松; 可维护性强,一个易读、简单的类自然也容易维护; 变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。 问题提出   假设有一个类C,它负责两个不同的职责:职责P1和P2。当职责P1需求发生改变而需要修改类C时,有可能会导致原本运行正常的职责P2功能发生故障。 解决方案   遵循单一职责原则。分别建立两个类C1、C2,使C1完成职责P1,C2完成职责P2。这样,当修改类C1时,不会使职责P2发生故障风险;同理,当修改C2时,也不会使职责P1发生故障风险。   说到这里,大家会觉得这个原则太简单了。稍有经验的程序员,即使没有听说过单一职责原则,在设计软件时也会自觉的遵守这一重要原则。在实际的项目开发中,谁也不希望因为修改了一个功能导致其他的功能发生故障。而避免出现这一问题的方法便是遵循单一职责原则。虽然单一职责原则如此简单,并且被认为是常识,即便是经验丰富的程序员写出的程序,也会有违背这一原则的代码存在。为什么会出现这种现象呢?因为有职责扩散。实际项目中,因为某种原因,职责P被分化为粒度更细的职责P1和P2。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值