OC-委托模式

来源:互联网 发布:美萍医药软件 编辑:程序博客网 时间:2024/06/14 20:48

简介:   

        委托模式从GOF装饰(decorator)模式、适配器(Adapter)模式和模板模式方法(template Method)模式等演变而来。几乎每一个引用或多或少地用到委托模式。不知识Cocoad Touch框架,在cocoa框架中,委托模式也得到了广泛地应用。

        假如一系列的出路都是在上帝类UIAPPlication中完成的。之所以叫”上帝类“ (god class),因为它“无所部能”,“包含所有”。在面向对象的软件设计中,“上帝类”不是很友好,需要重构。在编程过程中 要尽量避免使用上帝类,因为上帝类是搞耦合的,职责不清,难以维护。我们需要“去除上帝类”,把看似功能很强而且很难维护的类,按照职责将它的属性和方法分派到各自的类或分解成功能明确的类

      幸运的是苹果公司没有吧UIAPPlication设计成“上帝类”,而是将他们分割到两个不同的类中,其中一个扮演框架类角色,框架类具有通用,可重复使用、与具体应用无关等特点;另一个扮演应用相关类的角色,应用相关类与具体应用有关。由于受到框架类的控制,应用相关类常常被设计为“协议”,在java中称为“接口”,开发人员需要在具体的应用中实现这个“协议”, 在具体使用是,需要是实现UIApplicationDelegate协议。UIAPPlication 不直接依赖来于AppDelegate类,而是依赖于 UIApplicationDelegate协议,这在面向对象软件设计原则中叫做“面向接口编程”。AppDelegate类实现协议UIApplication,它是委托类。

     委托是为了降低一个对象的复杂度和耦合度,使能够更具通用性而将其中一些处理置于委托对象中的编码方式。通用类因为通用性(与具体应用的无关性)而变为框架类,框架类保持委托对象的指针,并在特定的时刻想委托对象发送消息。消息可能只是通知委托对象做一些事情,也可能是对委托对象进行控制

实例:

      古希腊有一位哲学家,他毕生只做三件事情:”睡觉“,”吃饭“,”工作“。为了更好地生活,提高工作的效率。他会找一个徒弟,把这些事情委托给他徒弟,然而要成为他的徒弟,需要实现一个协议,协议要求能处理 ” 吃饭“,“睡觉”,工作的问题。

      这个问题通用类(philosopher)就是哲学家,它通过delegate属性保持委托对象的引用,委托对象就是(viewcontrolller)就是作家的徒弟,它实现了协议philosopherDelegate,philosopherDelegate规定了三个方法 sleep 、eat、work

//  PhilosopherDelegate.h

#import <Foundation/Foundation.h>

@protocol  PhilosopherDelegate

@required

-(void)eat;

-(void)sleep;

-(void)work;

@end

@interface PhilosopherDelegate : NSObject

@end

// PhilosopherDelegate.m

#import "PhilosopherDelegate.h"


@implementation PhilosopherDelegate

-(void)eat{

  

}

-(void)sleep{

  

}

-(void)work{

  

}

@end


\\ Philosopher.h

#import <Foundation/Foundation.h>

#import "PhilosopherDelegate.h"

@interface Philosopher : NSObject

{

    NSTimer *timer;

    int count;

}

@property(nonatomic,weak)id<PhilosopherDelegate>delegate;

-(void)start;

-(void)handel;

@end


\\Philosopher.m

#import "Philosopher.h"


@implementation Philosopher

-(void)start{

    count = 0;

    timer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(handel) userInfo:nil repeats:YES];

}

-(void)handel{

    switch (count) {

        case 0:

            [self.delegate eat];

            count++;

            break;

        case 1:

            [self.delegate sleep];

            count++;

            break;

        case 2:

            [self.delegate work];

            count++;

            break;

            

        default:

            break;

    }

}

@end

// ViewController.m

#import "ViewController.h"

#import "Philosopher.h"

@interface ViewController ()<PhilosopherDelegate>

@end


@implementation ViewController


- (void)viewDidLoad {

 [super viewDidLoad];

Philosopher *tom = [[Philosopher alloc]init];

    tom.delegate = self;

    [tom start];

   

}

-(void)eat

{

    NSLog(@"eat.......");

}

-(void)sleep{

    NSLog(@"sleep......");

}

-(void)work{

    NSLog(@"work......");

}

关羽委托模式的例子还有很多  就不一一列举了









0 0