适配器模式,用于连接两种不同种类的对象,使其协同工作。一边是客户端懂得如何使用的目标接口,另一边是客户端一无所知的被适配者。适配器的主要作用是把被适配者的行为传递给管道另一端的客户端。
核心代码:
- //
- // StrokeColorCommand.h
- // TouchPainter
- //
- // Created by Carlo Chung on 11/9/10.
- // Copyright 2010 Carlo Chung. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #import "Command.h"
- typedef void (^RGBValuesProvider)(CGFloat *red, CGFloat *green, CGFloat *blue);
- typedef void (^PostColorUpdateProvider)(UIColor *color);
- @class SetStrokeColorCommand;
- @protocol SetStrokeColorCommandDelegate
- - (void) command:(SetStrokeColorCommand *) command
- didRequestColorComponentsForRed:(CGFloat *) red
- green:(CGFloat *) green
- blue:(CGFloat *) blue;
- - (void) command:(SetStrokeColorCommand *) command
- didFinishColorUpdateWithColor:(UIColor *) color;
- @end
- @interface SetStrokeColorCommand : Command
- {
- @private
- id <SetStrokeColorCommandDelegate> delegate_;
- RGBValuesProvider RGBValuesProvider_;
- PostColorUpdateProvider postColorUpdateProvider_;
- }
- @property (nonatomic, assign) id <SetStrokeColorCommandDelegate> delegate;
- @property (nonatomic, copy) RGBValuesProvider RGBValuesProvider;
- @property (nonatomic, copy) PostColorUpdateProvider postColorUpdateProvider;
- - (void) execute;
- @end
- //
- // StrokeColorCommand.h
- // TouchPainter
- //
- // Created by Carlo Chung on 11/9/10.
- // Copyright 2010 Carlo Chung. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #import "Command.h"
- typedef void (^RGBValuesProvider)(CGFloat *red, CGFloat *green, CGFloat *blue);
- typedef void (^PostColorUpdateProvider)(UIColor *color);
- @class SetStrokeColorCommand;
- @protocol SetStrokeColorCommandDelegate
- - (void) command:(SetStrokeColorCommand *) command
- didRequestColorComponentsForRed:(CGFloat *) red
- green:(CGFloat *) green
- blue:(CGFloat *) blue;
- - (void) command:(SetStrokeColorCommand *) command
- didFinishColorUpdateWithColor:(UIColor *) color;
- @end
- @interface SetStrokeColorCommand : Command
- {
- @private
- id <SetStrokeColorCommandDelegate> delegate_;
- RGBValuesProvider RGBValuesProvider_;
- PostColorUpdateProvider postColorUpdateProvider_;
- }
- @property (nonatomic, assign) id <SetStrokeColorCommandDelegate> delegate;
- @property (nonatomic, copy) RGBValuesProvider RGBValuesProvider;
- @property (nonatomic, copy) PostColorUpdateProvider postColorUpdateProvider;
- - (void) execute;
- @end
- //
- // StrokeColorCommand.m
- // TouchPainter
- //
- // Created by Carlo Chung on 11/9/10.
- // Copyright 2010 Carlo Chung. All rights reserved.
- //
- #import "SetStrokeColorCommand.h"
- #import "CoordinatingController.h"
- #import "CanvasViewController.h"
- @implementation SetStrokeColorCommand
- @synthesize delegate=delegate_;
- @synthesize postColorUpdateProvider=postColorUpdateProvider_;
- @synthesize RGBValuesProvider=RGBValuesProvider_;
- - (void) execute
- {
- CGFloat redValue = 0.0;
- CGFloat greenValue = 0.0;
- CGFloat blueValue = 0.0;
- // Retrieve RGB values from a delegate or a block
- // Delegation (object adapter) approach:
- [delegate_ command:self didRequestColorComponentsForRed:&redValue
- green:&greenValue
- blue:&blueValue];
- // Block approach:
- if (RGBValuesProvider_ != nil)
- {
- RGBValuesProvider_(&redValue, &greenValue, &blueValue);
- }
- // Create a color object based on the RGB values
- UIColor *color = [UIColor colorWithRed:redValue
- green:greenValue
- blue:blueValue
- alpha:1.0];
- // Assign it to the current canvasViewController
- CoordinatingController *coordinator = [CoordinatingController sharedInstance];
- CanvasViewController *controller = [coordinator canvasViewController];
- [controller setStrokeColor:color];
- // Forward a post update message
- // Delegation approach:
- [delegate_ command:self didFinishColorUpdateWithColor:color];
- // Block approach:
- if (postColorUpdateProvider_ != nil)
- {
- postColorUpdateProvider_(color);
- }
- }
- - (void) dealloc
- {
- [RGBValuesProvider_ release];
- [postColorUpdateProvider_ release];
- [super dealloc];
- }
- @end
- // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- // initialize the RGB sliders with
- // a StrokeColorCommand
- SetStrokeColorCommand *colorCommand = (SetStrokeColorCommand *)[redSlider_ command];
- // set each color component provider
- // to the color command
- [colorCommand setRGBValuesProvider: ^(CGFloat *red, CGFloat *green, CGFloat *blue)
- {
- *red = [redSlider_ value];
- *green = [greenSlider_ value];
- *blue = [blueSlider_ value];
- }];
- // set a post-update provider to the command
- // for any callback after a new color is set
- [colorCommand setPostColorUpdateProvider: ^(UIColor *color)
- {
- [paletteView_ setBackgroundColor:color];
- }];
- // restore the original values of the sliders
- // and the color of the small palette view
- NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
- CGFloat redValue = [userDefaults floatForKey:@"red"];
- CGFloat greenValue = [userDefaults floatForKey:@"green"];
- CGFloat blueValue = [userDefaults floatForKey:@"blue"];
- CGFloat sizeValue = [userDefaults floatForKey:@"size"];
- [redSlider_ setValue:redValue];
- [greenSlider_ setValue:greenValue];
- [blueSlider_ setValue:blueValue];
- [sizeSlider_ setValue:sizeValue];
- UIColor *color = [UIColor colorWithRed:redValue
- green:greenValue
- blue:blueValue
- alpha:1.0];
- [paletteView_ setBackgroundColor:color];
- }
- #pragma mark -
- #pragma mark SetStrokeColorCommandDelegate methods
- - (void) command:(SetStrokeColorCommand *) command
- didRequestColorComponentsForRed:(CGFloat *) red
- green:(CGFloat *) green
- blue:(CGFloat *) blue
- {
- *red = [redSlider_ value];
- *green = [greenSlider_ value];
- *blue = [blueSlider_ value];
- }
参考 《Object-C 编程之道 iOS设计模式解析》