所谓OCP设计原则就是Open Close Principle,即开闭原则。指软件的结构对扩展是开放的,对修改是关闭的。现有的软件结构可以无限制的扩展,而不能修改现有结构。
为达到OPC设计原则,就要将软件抽象,把软件的公共部分抽象出接口,然后其他类可以实现或依赖该接口。
以人养宠物为例。一个人养很多宠物,我们若直接让人和宠物直接关联起来,以后再增加一个宠物时代码中很多的地方都得做出修改。较好的方法是:抽象出一个接口Pet,让不同的宠物去继承并实现该接口,人与这个接口相关联。
1.抽象出一个Pet协议
@protocol Pet <NSObject>
@property(strong, nonatomic)NSString *name;
@end
2.分别建立Cat、Dog都实现该协议
#import "Pet.h"
@interface Cat : NSObject<Pet>
@property(nonatomic, strong)NSString *name;
@end
#import "Pet.h"
@interface Dog : NSObject<Pet>
@property(strong, nonatomic)NSString *name;
@end
3.使Person类依赖宠物集合数组
#import "Pet.h"
@interface Person : NSObject
@property(strong, nonatomic)NSString *name;
@property(strong,nonatomic)NSMutableArray *pets;
-(void)display;
@end
4.实现Person类的display方法
#import "Person.h"
@implementation Person
-(void)display
{
for (id<Pet> pet in self.pets ) {
NSLog(@"%@ ",pet.name);
}
}
@end
//id<Pet> pet表示pet是一个id类型的对象,并且它遵从Pet这个协议
5.程序测试
#import <Foundation/Foundation.h>
#import "Pet.h"
#import "Cat.h"
#import "Dog.h"
#import "Person.h"
int main()
{
@autoreleasepool {
id<Pet> cat = [[Cat alloc]init];
cat.name=@"花花猫";
id<Pet> dog=[[Dog alloc]init];
dog.name=@"旺财狗";
Person *per= [[Person alloc]init];
per.name=@"小李";
NSMutableArray *pets=[NSMutableArray arrayWithCapacity:2];
[pets addObject:cat];
[pets addObject:dog];
per.pets=pets;
[per display];
}
}
每当有新的宠物类时我们只需要继承自Pet协议并实现该协议,生成新类的对象并加入到NSMultable数组中就可以添加成功。可见协议的采用增强了程序的可扩展性。