首页 > 代码库 > OCP设计原则

OCP设计原则

        所谓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数组中就可以添加成功。可见协议的采用增强了程序的可扩展性。

OCP设计原则