亲们:在看设计模式的时候大家如果看到了我这篇,建议大家看下他们的概念流程,设计思想,为什么这么设计,设计的好处。我们大家所熟知的23中设计模式最初都是java编程来设计的,这个思想很好,而对于iOS来说其实有很多苹果已经封装的很好比如:工厂模式就是为了更好的创建对象。我们比如进行模型转换运用Mj的jsonmodel,然后得到我们想要的对象,具体他怎么实现的,我们不需要关心,这就是工厂的封装思想。iOS 和 java 都是单继承和多层继承,但是java还有个面向接口编程,接口就可以实现多层继承,iOS里面没有这些。有些模式在运用的时候,一般编程简单的,像iOS vue Ract 这些都很好,对于一些我们自己创建的复杂对象接口,这个时候我们就要考虑他的模式。他们实现还是有点区别,所以最主要的还是思想,特别是里面的抽象思想。 建议大家了解这个去看下java的相关讲解(我也是看到java,结合iOS)然后结合下咱们所开发的项目进行设计。
OOP七大原则
- 开闭原则:对扩展开放,对修改关闭
- 里氏替换原则:继承必须确保父类所拥有的性质在子类中仍然成立。
- 依赖倒置原则:要面向接口编程,不要面向实现编程。
- 单一职责原则:控制类的粒度大小,将对象解耦,提高其内聚性。
- 接口隔离原则:要为各个类建立他们需要的接口。
- 迪米特法则:只与你的朋友交谈 不与陌生人说话。
- 合成服用原则:尽量先试用组合或者聚合等关联关系来实现,其次考虑继承来实现。
工厂模式
作用:实现创建者和调用者分离。
分类:
- 简单工厂模式:用来生产同一等级结构中的任意产品(对增加的新产品需要覆盖代码)
- 工厂方法模式:用来生产同一等级结构的固定产品,支持增加任意产品。
- 抽象工厂模式:围绕一个超级工厂创建其他工厂,该工厂又称为工厂的工厂
建造者模式
定义:将一个复杂的对象与它的表示分离,使得同样的构建过程可以创建不同的表示
主要作用:在用户不知道对象创造过程和细节的情况下直接创建复杂的对象,用户只需要给出指定的复杂对象类型的内容,建造者模式负责按顺序创建复杂对象(把内部建造的过程和细节隐藏起来)
适配器模式
定义:讲一个类的接口转换成客户希望的另一个类的接口,适配器让原来不兼容的那些类可以一起工作
角色分析:
- 目标接口:客户所期待的接口,目标可以是具体或者抽象的类,也可以是接口
- 需要适配器的类:需要适配的类或者适配者类
- 适配器:通过包装一个需要适配的对象,把原接口转换成目标对象
在我们开发的图形界面编程中我们用到的场景好多,大家可以想一下,例如一个接口的对其进行转换
// 适配者类
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface Adaptee : NSObject
- (void)getNetWork;
@end
NS_ASSUME_NONNULL_END
#import "Adaptee.h"
@implementation Adaptee
- (void)getNetWork {
NSLog(@"woyaoshangwang");
}
@end
// 电脑类
#import "Adapter.h"
NS_ASSUME_NONNULL_BEGIN
@interface Computer : NSObject
- (void)net:(Adapter *)adapter;
@end
NS_ASSUME_NONNULL_END
#import "Computer.h"
@implementation Computer
- (void)net:(Adapter *)adapter {
NSLog(@"上网的具体实现");
[adapter handleRequest];
}
@end
// 适配器
#import <Foundation/Foundation.h>
@class Adaptee;
NS_ASSUME_NONNULL_BEGIN
@interface Adapter : NSObject
- (id) initWith:(Adaptee *)adaptee ;
- (void)handleRequest;
@end
#import "Adapter.h"
#import "Adaptee.h"
@interface Adapter ()
@property (nonatomic, strong) Adaptee *adaptee;
@end
@implementation Adapter
- (id) initWith:(Adaptee *)adaptee {
if (self = [super init]) {
self.adaptee = adaptee;
}
return self;
}
- (void)handleRequest {
[self.adaptee getNetWork];
}
@end
// 调用
// 电脑
Computer *com = [[Computer alloc] init];
// 适配者类
Adaptee *ad = [[Adaptee alloc] init];
// 适配器接入适配者
Adapter *ader = [[Adapter alloc] initWith:ad];
// 电脑接入适配器
[com net:ader];
注:适配器 连接 两端
桥接模式
定义:桥接模式是将抽象部分与他的实现部分分离,让他们都可以独立的变化,他是一种对象结构型模式又称接口模式
这个时候大家可以看 如果我们添加电脑的类型 与添加右边品牌的类型没有任何的影响这样我们就解决了他们之前的耦合度和中间代码量,让我们写的时候更加的灵活
代理模式
角色分析
- 抽象角色:一般会使用抽象接口或者抽象类来解决
- 真是角色:被代理的角色
- 代理角色:代理真是角色,代理真是角色后,我们一般会做些附属操作
- 客户:方位代理对象的人。
代理模式的好处:
- 可以让真实的角色更加纯粹!不去关注一些公共的业务
- 公共也就交个代理角色,实现业务分工
- 公共业务发生扩展的时候,方便集中管理
缺点:
- 一个真是的角色就会产生一个代理的角色,代码量会翻倍,开发效率会变低
步骤:
- 接口
- 真是角色
- 代理角色
- 客户端访问代理角色