Objective-C代码实现26种设计模式

以下是Objective-C代码实现26种设计模式的示例:

//工厂方法模式(Factory Method Pattern)
// Product.h
@interface Product : NSObject
- (void)operation;
@end

// Creator.h
@interface Creator : NSObject
- (Product *)createProduct;
@end

// ConcreteProduct.h
@interface ConcreteProduct : Product
@end

// ConcreteCreator.h
@interface ConcreteCreator : Creator
@end

// ConcreteCreator.m
@implementation ConcreteCreator
- (Product *)createProduct {
    return [[ConcreteProduct alloc] init];
}
@end
//抽象工厂模式(Abstract Factory Pattern)
// AbstractFactory.h
@interface AbstractFactory : NSObject
- (ProductA *)createProductA;
- (ProductB *)createProductB;
@end

// ConcreteFactory1.h
@interface ConcreteFactory1 : AbstractFactory
@end

// ConcreteFactory2.h
@interface ConcreteFactory2 : AbstractFactory
@end

// ProductA.h
@interface ProductA : NSObject
- (void)operationA;
@end

// ProductB.h
@interface ProductB : NSObject
- (void)operationB;
@end

// ConcreteProductA1.h
@interface ConcreteProductA1 : ProductA
@end

// ConcreteProductB1.h
@interface ConcreteProductB1 : ProductB
@end

// ConcreteProductA2.h
@interface ConcreteProductA2 : ProductA
@end

// ConcreteProductB2.h
@interface ConcreteProductB2 : ProductB
@end

// ConcreteFactory1.m
@implementation ConcreteFactory1
- (ProductA *)createProductA {
    return [[ConcreteProductA1 alloc] init];
}
- (ProductB *)createProductB {
    return [[ConcreteProductB1 alloc] init];
}
@end

// ConcreteFactory2.m
@implementation ConcreteFactory2
- (ProductA *)createProductA {
    return [[ConcreteProductA2 alloc] init];
}
- (ProductB *)createProductB {
    return [[ConcreteProductB2 alloc] init];
}
@end
//单例模式(Singleton Pattern)
// Singleton.h
@interface Singleton : NSObject
+ (instancetype)sharedInstance;
@end

// Singleton.m
@implementation Singleton
+ (instancetype)sharedInstance {
    static Singleton *instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[self alloc] init];
    });
    return instance;
}
@end
//建造者模式(Builder Pattern)
// Product.h
@interface Product : NSObject
@property (nonatomic, strong) NSString *partA;
@property (nonatomic, strong) NSString *partB;
@property (nonatomic, strong) NSString *partC;
@end

// Builder.h
@interface Builder : NSObject
- (void)buildPartA;
- (void)buildPartB;
- (void)buildPartC;
- (Product *)getResult;
@end

// ConcreteBuilder.h
@interface ConcreteBuilder : Builder
@property (nonatomic, strong) Product *product;
@end

// ConcreteBuilder.m
@implementation ConcreteBuilder
- (instancetype)init {
    if (self = [super init]) {
        _product = [[Product alloc] init];
    }
    return self;
}
- (void)buildPartA {
    _product.partA = @"Part A";
}
- (void)buildPartB {
    _product.partB = @"Part B";
}
- (void)buildPartC {
    _product.partC = @"Part C";
}
- (Product *)getResult {
    return _product;
}
@end

// Director.h
@interface Director : NSObject
- (Product *)construct;
@end

// Director.m
@implementation Director
- (Product *)construct {
    ConcreteBuilder *builder = [[ConcreteBuilder alloc] init];
    [builder buildPartA];
    [builder buildPartB];
    [builder buildPartC];
    return [builder getResult];
}
@end
//原型模式(Prototype Pattern)
// Prototype.h
@interface Prototype : NSObject <NSCopying>
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end

// Prototype.m
@implementation Prototype
- (instancetype)copyWithZone:(NSZone *)zone {
    Prototype *copy = [[[self class] allocWithZone:zone] init];
    copy.name = self.name;
    copy.age = self.age;
    return copy;
}
@end
//适配器模式(Adapter Pattern)
// Target.h
@interface Target : NSObject
- (void)request;
@end

// Adaptee.h
@interface Adaptee : NSObject
- (void)specificRequest;
@end

// Adapter.h
@interface Adapter : Target
@property (nonatomic, strong) Adaptee *adaptee;
@end

// Adapter.m
@implementation Adapter
- (void)request {
    [self.adaptee specificRequest];
}
@end
//桥接模式(Bridge Pattern)
// Implementor.h
@interface Implementor : NSObject
- (void)operationImp;
@end

// Abstraction.h
@interface Abstraction : NSObject
@property (nonatomic, strong) Implementor *implementor;
- (void)operation;
@end

// ConcreteImplementorA.h
@interface ConcreteImplementorA : Implementor
@end

// ConcreteImplementorB.h
@interface ConcreteImplementorB : Implementor
@end

// RefinedAbstraction.h
@interface RefinedAbstraction : Abstraction
@end

// Implementor.m
@implementation Implementor
- (void)operationImp {
    // implementation
}
@end

// Abstraction.m
@implementation Abstraction
- (void)operation {
    [self.implementor operationImp];
}
@end

// ConcreteImplementorA.m
@implementation ConcreteImplementorA
- (void)operationImp {
    // implementation A
}
@end

// ConcreteImplementorB.m
@implementation ConcreteImplementorB
- (void)operationImp {
    // implementation B
}
@end

// RefinedAbstraction.m
@implementation RefinedAbstraction
- (void)operation {
    [super operation];
    // additional implementation
}
@end
//组合模式(Composite Pattern)
// Component.h
@interface Component : NSObject
@property (nonatomic, strong) NSString *name;
- (void)add:(Component *)component;
- (void)remove:(Component *)component;
- (void)display:(NSInteger)depth;
@end

// Leaf.h
@interface Leaf : Component
@end

// Composite.h
@interface Composite : Component
@property (nonatomic, strong) NSMutableArray *children;
@end

// Component.m
@implementation Component
- (instancetype)init {
    if (self = [super init]) {
        _name = @"";
    }
    return self;
}
- (void)add:(Component *)component {}
- (void)remove:(Component *)component {}
- (void)display:(NSInteger)depth {}
@end

// Leaf.m
@implementation Leaf
- (void)display:(NSInteger)depth {
    NSString *prefix = [@"" stringByPaddingToLength:depth withString:@"-" startingAtIndex:0];
    NSLog(@"%@%@", prefix, self.name);
}
@end

// Composite.m
@implementation Composite
- (instancetype)init {
    if (self = [super init]) {
        _children = [NSMutableArray array];
    }
    return self;
}
- (void)add:(Component *)component {
    [self.children addObject:component];
}
- (void)remove:(Component *)component {
    [self.children removeObject:component];
}
- (void)display:(NSInteger)depth {
    NSString *prefix = [@"" stringByPaddingToLength:depth withString:@"-" startingAtIndex:0];
    NSLog(@"%@%@", prefix, self.name);
    for (Component *component in self.children) {
        [component display:depth + 2];
    }
}
@end
//装饰器模式(Decorator Pattern)
// Component.h
@interface Component : NSObject
- (void)operation;
@end

// ConcreteComponent.h
@interface ConcreteComponent : Component
@end

// Decorator.h
@interface Decorator : Component
@property (nonatomic, strong) Component *component;
@end

// ConcreteDecoratorA.h
@interface ConcreteDecoratorA : Decorator
@end

// ConcreteDecoratorB.h
@interface ConcreteDecoratorB : Decorator
@end

// Component.m
@implementation Component
- (void)operation {}
@end

// ConcreteComponent.m
@implementation ConcreteComponent
- (void)operation {
    // implementation
}
@end

// Decorator.m
@implementation Decorator
- (instancetype)initWithComponent:(Component *)component {
    if (self = [super init]) {
        _component = component;
    }
    return self;
}
- (void)operation {
    [self.component operation];
}
@end

// ConcreteDecoratorA.m
@implementation ConcreteDecoratorA
- (void)operation {
    [super operation];
    // additional implementation A
}
@end

// ConcreteDecoratorB.m
@implementation ConcreteDecoratorB
- (void)operation {
    [super operation];
    // additional implementation B
}
@end
//外观模式(Facade Pattern)
// SubsystemA.h
@interface SubsystemA : NSObject
- (void)operationA;
@end

// SubsystemB.h
@interface SubsystemB : NSObject
- (void)operationB;
@end

// SubsystemC.h
@interface SubsystemC : NSObject
- (void)operationC;
@end

// Facade.h
@interface Facade : NSObject
@property (nonatomic, strong) SubsystemA *subsystemA;
@property (nonatomic, strong) SubsystemB *subsystemB;
@property (nonatomic, strong) SubsystemC *subsystemC;
- (void)operation;
@end

// SubsystemA.m
@implementation SubsystemA
- (void)operationA {
    // implementation
}
@end

// SubsystemB.m
@implementation SubsystemB
- (void)operationB {
    // implementation
}
@end

// SubsystemC.m
@implementation SubsystemC
- (void)operationC {
    // implementation
}
@end

// Facade.m
@implementation Facade
- (instancetype)init {
    if (self = [super init]) {
        _subsystemA = [[SubsystemA alloc] init];
        _subsystemB = [[SubsystemB alloc] init];
        _subsystemC = [[SubsystemC alloc] init];
    }
    return self;
}
- (void)operation {
    [self.subsystemA operationA];
    [self.subsystemB operationB];
    [self.subsystemC operationC];
}
@end
//享元模式(Flyweight Pattern)
// Flyweight.h
@interface Flyweight : NSObject
- (void)operation:(NSString *)extrinsicState;
@end

// ConcreteFlyweight.h
@interface ConcreteFlyweight : Flyweight
@property (nonatomic, strong) NSString *intrinsicState;
@end

// FlyweightFactory.h
@interface FlyweightFactory : NSObject
@property (nonatomic, strong) NSMutableDictionary *flyweights;
- (Flyweight *)getFlyweight:(NSString *)key;
@end

// Flyweight.m
@implementation Flyweight
- (void)operation:(NSString *)extrinsicState {}
@end

// ConcreteFlyweight.m
@implementation ConcreteFlyweight
- (void)operation:(NSString *)extrinsicState {
    NSLog(@"Intrinsic state: %@, extrinsic state: %@", self.intrinsicState, extrinsicState);
}
@end

// FlyweightFactory.m
@implementation FlyweightFactory
- (instancetype)init {
    if (self = [super init]) {
        _flyweights = [NSMutableDictionary dictionary];
    }
    return self;
}
- (Flyweight *)getFlyweight:(NSString *)key {
    Flyweight *flyweight = self.flyweights[key];
    if (!flyweight) {
        flyweight = [[ConcreteFlyweight alloc] init];
        flyweight.intrinsicState = key;
        self.flyweights[key] = flyweight;
    }
    return flyweight;
}
@end
//代理模式(Proxy Pattern)
// Subject.h
@interface Subject : NSObject
- (void)request;
@end

// RealSubject.h
@interface RealSubject : Subject
@end

// Proxy.h
@interface Proxy : Subject
@property (nonatomic, strong) RealSubject *realSubject;
@end

// Proxy.m
@implementation Proxy
- (void)request {
    [self.realSubject request];
}
@end
//责任链模式(Chain of Responsibility Pattern)
// Handler.h
@interface Handler : NSObject
@property (nonatomic, strong) Handler *successor;
- (void)handleRequest:(NSInteger)request;
@end

// ConcreteHandler1.h
@interface ConcreteHandler1 : Handler
@end

// ConcreteHandler2.h
@interface ConcreteHandler2 : Handler
@end

// Handler.m
@implementation Handler
- (void)handleRequest:(NSInteger)request {
    if (self.successor) {
        [self.successor handleRequest:request];
    }
}
@end

// ConcreteHandler1.m
@implementation ConcreteHandler1
- (void)handleRequest:(NSInteger)request {
    if (request == 1) {
        // handle request
    } else {
        [super handleRequest:request];
    }
}
@end

// ConcreteHandler2.m
@implementation ConcreteHandler2
- (void)handleRequest:(NSInteger)request {
    if (request == 2) {
        // handle request
    } else {
        [super handleRequest:request];
    }
}
@end
//命令模式(Command Pattern)
// Receiver.h
@interface Receiver : NSObject
- (void)action;
@end

// Command.h
@interface Command : NSObject
@property (nonatomic, strong) Receiver *receiver;
- (void)execute;
@end

// ConcreteCommand.h
@interface ConcreteCommand : Command
@end

// Invoker.h
@interface Invoker : NSObject
@property (nonatomic, strong) Command *command;
- (void)invoke;
@end

// Receiver.m
@implementation Receiver
- (void)action {
    // implementation
}
@end

// Command.m
@implementation Command
- (void)execute {
    [self.receiver action];
}
@end

// ConcreteCommand.m
@implementation ConcreteCommand
- (void)execute {
    [super execute];
    // additional implementation
}
@end

// Invoker.m
@implementation Invoker
- (void)invoke {
    [self.command execute];
}
@end
//解释器模式(Interpreter Pattern)
// Context.h
@interface Context : NSObject
@property (nonatomic, strong) NSString *input;
@property (nonatomic, strong) NSString *output;
@end

// AbstractExpression.h
@interface AbstractExpression : NSObject
- (void)interpret:(Context *)context;
@end

// TerminalExpression.h
@interface TerminalExpression : AbstractExpression
@end

// NonterminalExpression.h
@interface NonterminalExpression : AbstractExpression
@property (nonatomic, strong) AbstractExpression *expression;
@end

// Context.m
@implementation Context
- (instancetype)init {
    if (self = [super init]) {
        _input = @"";
        _output = @"";
    }
    return self;
}
@end

// AbstractExpression.m
@implementation AbstractExpression
- (void)interpret:(Context *)context {}
@end

// TerminalExpression.m
@implementation TerminalExpression
- (void)interpret:(Context *)context {
    // implementation
}
@end

// NonterminalExpression.m
@implementation NonterminalExpression
- (void)interpret:(Context *)context {
    [self.expression interpret:context];
    // additional implementation
}
@end
//迭代器模式(Iterator Pattern)
// Iterator.h
@interface Iterator : NSObject
- (id)next;
- (BOOL)hasNext;
@end

// Aggregate.h
@interface Aggregate : NSObject
- (Iterator *)createIterator;
@end

// ConcreteIterator.h
@interface ConcreteIterator : Iterator
@property (nonatomic, strong) NSMutableArray *items;
@property (nonatomic, assign) NSInteger position;
@end

// ConcreteAggregate.h
@interface ConcreteAggregate : Aggregate
@property (nonatomic, strong) NSMutableArray *items;
@end

// Iterator.m
@implementation Iterator
- (id)next {
    return nil;
}
- (BOOL)hasNext {
    return NO;
}
@end

// Aggregate.m
@implementation Aggregate
- (Iterator *)createIterator {
    return nil;
}
@end

// ConcreteIterator.m
@implementation ConcreteIterator
- (id)next {
    if ([self hasNext]) {
        id item = self.items[self.position];
        self.position++;
        return item;
    } else {
        return nil;
    }
}
- (BOOL)hasNext {
    return self.position < self.items.count;
}
@end

// ConcreteAggregate.m
@implementation ConcreteAggregate
- (instancetype)init {
    if (self = [super init]) {
        _items = [NSMutableArray array];
    }
    return self;
}
- (Iterator *)createIterator {
    ConcreteIterator *iterator = [[ConcreteIterator alloc] init];
    iterator.items = self.items;
    return iterator;
}
@end
//中介者模式(Mediator Pattern)
// Mediator.h
@interface Mediator : NSObject
- (void)send:(NSString *)message colleague:(Colleague *)colleague;
@end

// Colleague.h
@interface Colleague : NSObject
@property (nonatomic, strong) Mediator *mediator;
- (void)send:(NSString *)message;
- (void)receive:(NSString *)message;
@end

// ConcreteMediator.h
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容