适配器模式 - 设计模式系列

适配器模式,用于连接两种不同种类的对象,使其协同工作。一边是客户端懂得如何使用的目标接口,另一边是客户端一无所知的被适配者。适配器的主要作用是把被适配者的行为传递给管道另一端的客户端。


核心代码:

[html]  view plain copy
  1. //  
  2. //  StrokeColorCommand.h  
  3. //  TouchPainter  
  4. //  
  5. //  Created by Carlo Chung on 11/9/10.  
  6. //  Copyright 2010 Carlo Chung. All rights reserved.  
  7. //  
  8.   
  9. #import <Foundation/Foundation.h>  
  10. #import "Command.h"  
  11.   
  12. typedef void (^RGBValuesProvider)(CGFloat *red, CGFloat *green, CGFloat *blue);  
  13. typedef void (^PostColorUpdateProvider)(UIColor *color);  
  14.   
  15. @class SetStrokeColorCommand;  
  16.   
  17. @protocol SetStrokeColorCommandDelegate  
  18.   
  19. - (void) command:(SetStrokeColorCommand *) command   
  20.                 didRequestColorComponentsForRed:(CGFloat *) red  
  21.                                           green:(CGFloat *) green   
  22.                                            blue:(CGFloat *) blue;  
  23.   
  24. - (void) command:(SetStrokeColorCommand *) command  
  25.                 didFinishColorUpdateWithColor:(UIColor *) color;  
  26.   
  27. @end  
  28.   
  29.   
  30. @interface SetStrokeColorCommand : Command  
  31. {  
  32.   @private  
  33.   id <SetStrokeColorCommandDelegate> delegate_;    
  34.   RGBValuesProvider RGBValuesProvider_;  
  35.   PostColorUpdateProvider postColorUpdateProvider_;  
  36. }  
  37.   
  38. @property (nonatomic, assign) id <SetStrokeColorCommandDelegate> delegate;  
  39. @property (nonatomic, copy) RGBValuesProvider RGBValuesProvider;  
  40. @property (nonatomic, copy) PostColorUpdateProvider postColorUpdateProvider;  
  41.   
  42. - (void) execute;  
  43.   
  44. @end  


[html]  view plain copy
  1. //  
  2. //  StrokeColorCommand.h  
  3. //  TouchPainter  
  4. //  
  5. //  Created by Carlo Chung on 11/9/10.  
  6. //  Copyright 2010 Carlo Chung. All rights reserved.  
  7. //  
  8.   
  9. #import <Foundation/Foundation.h>  
  10. #import "Command.h"  
  11.   
  12. typedef void (^RGBValuesProvider)(CGFloat *red, CGFloat *green, CGFloat *blue);  
  13. typedef void (^PostColorUpdateProvider)(UIColor *color);  
  14.   
  15. @class SetStrokeColorCommand;  
  16.   
  17. @protocol SetStrokeColorCommandDelegate  
  18.   
  19. - (void) command:(SetStrokeColorCommand *) command   
  20.                 didRequestColorComponentsForRed:(CGFloat *) red  
  21.                                           green:(CGFloat *) green   
  22.                                            blue:(CGFloat *) blue;  
  23.   
  24. - (void) command:(SetStrokeColorCommand *) command  
  25.                 didFinishColorUpdateWithColor:(UIColor *) color;  
  26.   
  27. @end  
  28.   
  29.   
  30. @interface SetStrokeColorCommand : Command  
  31. {  
  32.   @private  
  33.   id <SetStrokeColorCommandDelegate> delegate_;    
  34.   RGBValuesProvider RGBValuesProvider_;  
  35.   PostColorUpdateProvider postColorUpdateProvider_;  
  36. }  
  37.   
  38. @property (nonatomic, assign) id <SetStrokeColorCommandDelegate> delegate;  
  39. @property (nonatomic, copy) RGBValuesProvider RGBValuesProvider;  
  40. @property (nonatomic, copy) PostColorUpdateProvider postColorUpdateProvider;  
  41.   
  42. - (void) execute;  
  43.   
  44. @end  


[html]  view plain copy
  1. //  
  2. //  StrokeColorCommand.m  
  3. //  TouchPainter  
  4. //  
  5. //  Created by Carlo Chung on 11/9/10.  
  6. //  Copyright 2010 Carlo Chung. All rights reserved.  
  7. //  
  8.   
  9. #import "SetStrokeColorCommand.h"  
  10. #import "CoordinatingController.h"  
  11. #import "CanvasViewController.h"  
  12.   
  13. @implementation SetStrokeColorCommand  
  14.   
  15. @synthesize delegate=delegate_;  
  16. @synthesize postColorUpdateProvider=postColorUpdateProvider_;  
  17. @synthesize RGBValuesProvider=RGBValuesProvider_;  
  18.   
  19.   
  20. - (void) execute  
  21. {  
  22.   CGFloat redValue = 0.0;  
  23.   CGFloat greenValue = 0.0;  
  24.   CGFloat blueValue = 0.0;  
  25.     
  26.   // Retrieve RGB values from a delegate or a block   
  27.     
  28.   // Delegation (object adapter) approach:  
  29.   [delegate_ command:self didRequestColorComponentsForRed:&redValue  
  30.                                                     green:&greenValue  
  31.                                                      blue:&blueValue];  
  32.     
  33.   // Block approach:  
  34.   if (RGBValuesProvider_ != nil)  
  35.   {  
  36.     RGBValuesProvider_(&redValue, &greenValue, &blueValue);  
  37.   }  
  38.     
  39.   // Create a color object based on the RGB values  
  40.   UIColor *color = [UIColor colorWithRed:redValue  
  41.                                    green:greenValue  
  42.                                     blue:blueValue  
  43.                                    alpha:1.0];  
  44.     
  45.   // Assign it to the current canvasViewController  
  46.   CoordinatingController *coordinator = [CoordinatingController sharedInstance];  
  47.   CanvasViewController *controller = [coordinator canvasViewController];  
  48.   [controller setStrokeColor:color];  
  49.     
  50.   // Forward a post update message  
  51.     
  52.   // Delegation approach:  
  53.   [delegate_ command:self didFinishColorUpdateWithColor:color];  
  54.     
  55.   // Block approach:  
  56.   if (postColorUpdateProvider_ != nil)  
  57.   {  
  58.     postColorUpdateProvider_(color);  
  59.   }  
  60. }  
  61.   
  62. - (void) dealloc  
  63. {  
  64.   [RGBValuesProvider_ release];  
  65.   [postColorUpdateProvider_ release];  
  66.   [super dealloc];  
  67. }  
  68.   
  69. @end  


[html]  view plain copy
  1. // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.  
  2. - (void)viewDidLoad   
  3. {  
  4.   [super viewDidLoad];  
  5.     
  6.   // initialize the RGB sliders with  
  7.   // a StrokeColorCommand  
  8.   SetStrokeColorCommand *colorCommand = (SetStrokeColorCommand *)[redSlider_ command];  
  9.     
  10.   // set each color component provider  
  11.   // to the color command  
  12.   [colorCommand setRGBValuesProvider: ^(CGFloat *red, CGFloat *green, CGFloat *blue)  
  13.    {  
  14.      *red = [redSlider_ value];  
  15.      *green = [greenSlider_ value];  
  16.      *blue = [blueSlider_ value];  
  17.    }];  
  18.     
  19.   // set a post-update provider to the command  
  20.   // for any callback after a new color is set  
  21.   [colorCommand setPostColorUpdateProvider: ^(UIColor *color)   
  22.    {  
  23.      [paletteView_ setBackgroundColor:color];  
  24.    }];  
  25.     
  26.     
  27.   // restore the original values of the sliders  
  28.   // and the color of the small palette view  
  29.   NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];  
  30.   CGFloat redValue = [userDefaults floatForKey:@"red"];  
  31.   CGFloat greenValue = [userDefaults floatForKey:@"green"];  
  32.   CGFloat blueValue = [userDefaults floatForKey:@"blue"];  
  33.   CGFloat sizeValue = [userDefaults floatForKey:@"size"];  
  34.     
  35.   [redSlider_ setValue:redValue];  
  36.   [greenSlider_ setValue:greenValue];  
  37.   [blueSlider_ setValue:blueValue];  
  38.   [sizeSlider_ setValue:sizeValue];  
  39.     
  40.   UIColor *color = [UIColor colorWithRed:redValue  
  41.                                    green:greenValue  
  42.                                     blue:blueValue  
  43.                                    alpha:1.0];  
  44.     
  45.   [paletteView_ setBackgroundColor:color];  
  46. }  
  47.   
  48.   
  49. #pragma mark -  
  50. #pragma mark SetStrokeColorCommandDelegate methods  
  51.   
  52. - (void) command:(SetStrokeColorCommand *) command   
  53.                 didRequestColorComponentsForRed:(CGFloat *) red  
  54.                                           green:(CGFloat *) green   
  55.                                            blue:(CGFloat *) blue  
  56. {  
  57.   *red = [redSlider_ value];  
  58.   *green = [greenSlider_ value];  
  59.   *blue = [blueSlider_ value];  
  60. }  



参考 《Object-C 编程之道 iOS设计模式解析》


你可能感兴趣的:(适配器模式 - 设计模式系列)