一、六大设计原则:单一职责原则 、开闭原则、接口隔离原则、依赖倒置原则、里氏替换原则、迪米特原则。
1、单一职责原则:一个类只负责一件事。例如,CALayer和UIView的关系,UIView只负责事件传递响应,CALayer只负责动画以及视图的展示。
2、开闭原则:对修改关闭,对扩展开放。例如,定义类时,尽量考虑类的扩展性和灵活性,尽量避免之后反复修改类,之后只做类的扩展和子类继承。
3、接口隔离原则:使用多个专门的协议,而不是一个庞大臃肿的协议。同时协议中的方法尽量少。例如,UITableView的UITableViewDelegate专门负责回调代理事件,UITableViewDataSource专门负责数据源。
4、依赖倒置原则:抽象不应该依赖于具体实现,具体实现可以依赖于抽象。例如,数据库的增删改查,上层业务只依赖于抽象的接口,而接口内部的实现(如用plist文件,sqlite等等),上层业务是不关注的。
5、里氏替换原则:父类可以被子类无缝替换,且原有的功能不受任何影响。例如,kvo实现原理。
6、迪米特原则:一个对象应当对其他对象有尽可能少的了解。高内聚,低耦合。
二、常见的设计模式有责任链、桥接、适配器、单例、命令。
1、责任链:事件响应机制。
2、桥接:一个页面列表同时使用多套网络数据。
3、适配器:一个现有类需要适应变化的问题。有对象适配器和类适配器两种。
-(void){
//适配逻辑
[被适配对象 某方法]
//适配逻辑
}
4、单例:
+ (id)sharedInstance
{
// 静态局部变量
static SingleInstance *instance = nil;
// 通过dispatch_once方式 确保instance在多线程环境下只被创建一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 创建实例,需要用super调用,用self调用会造成循环调用,导致奔溃。
instance = [[super allocWithZone:NULL] init];
});
return instance;
}
// 重写方法【必不可少】。[[self alloc] init]调用时,会默认调用
+ (id)allocWithZone:(struct _NSZone *)zone{
return [self sharedInstance];
}
// 重写方法【必不可少】。对象做copy时,会默认调用
- (id)copyWithZone:(nullable NSZone *)zone{
return self;
}
SingleInstance *a= [SingleInstance sharedInstance];
SingleInstance *b= [[SingleInstance alloc]init];
SingleInstance *c= [SingleInstance allocWithZone:nil];
SingleInstance *d= [a copy];
NSLog(@"%@---%@---%@---%@",a,b,c,d);
5、命令:行为参数话,降低代码耦合度。例如,微博App中,每个页面都可以进行转发、评论、点赞,需要在各个页面中都实现这个业务逻辑。