zoukankan      html  css  js  c++  java
  • iOS设计模式

    iOS设计模式 - 装饰

    原理图

    说明

    1. cocoa框架本身实现了装饰模式(category的方式实现了装饰模式)

    2. 装饰模式指的是动态的给一个对象添加一些额外的职责,相对于继承子类来说,装饰模式更加灵活

    *3. 本人仅仅实现了最简单的装饰模式,装饰器类是一个具体的类,非抽象类

    源码

    https://github.com/YouXianMing/iOS-Design-Patterns

    //
    //  GamePlay.h
    //  DecoratorPattern
    //
    //  Created by YouXianMing on 15/8/1.
    //  Copyright (c) 2015年 YouXianMing. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    @interface GamePlay : NSObject
    
    /**
     *  游戏币的数量
     */
    @property (nonatomic) NSInteger coin;
    
    /**
     *  上下左右的操作
     */
    - (void)up;
    - (void)down;
    - (void)left;
    - (void)right;
    
    /**
     *  选择与开始的操作
     */
    - (void)select;
    - (void)start;
    
    /**
     *  按钮 A + B 的操作
     */
    - (void)commandA;
    - (void)commandB;
    
    @end
    //
    //  GamePlay.m
    //  DecoratorPattern
    //
    //  Created by YouXianMing on 15/8/1.
    //  Copyright (c) 2015年 YouXianMing. All rights reserved.
    //
    
    #import "GamePlay.h"
    
    @implementation GamePlay
    
    - (void)up {
    
        NSLog(@"up");
    }
    
    - (void)down {
    
        NSLog(@"down");
    }
    
    - (void)left {
    
        NSLog(@"left");
    }
    
    - (void)right {
    
        NSLog(@"right");
    }
    
    
    - (void)select {
    
        NSLog(@"select");
    }
    
    - (void)start {
    
        NSLog(@"start");
    }
    
    - (void)commandA {
    
        NSLog(@"commandA");
    }
    
    - (void)commandB {
    
        NSLog(@"commandB");
    }
    
    
    @end
    //
    //  DecoratorGamePlay.h
    //  DecoratorPattern
    //
    //  Created by YouXianMing on 15/8/1.
    //  Copyright (c) 2015年 YouXianMing. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import "GamePlay.h"
    
    @interface DecoratorGamePlay : NSObject
    
    @property (nonatomic) NSInteger coin;
    
    - (void)up;
    - (void)down;
    - (void)left;
    - (void)right;
    - (void)select;
    - (void)start;
    - (void)commandA;
    - (void)commandB;
    
    #pragma mark - 以下为装饰对象新添加的功能
    
    /**
     *  剩余几条命
     */
    @property (nonatomic, readonly) NSInteger  lives;
    
    /**
     *  作弊 (上下上下左右左右ABAB)
     */
    - (void)cheat;
    
    @end
    //
    //  DecoratorGamePlay.m
    //  DecoratorPattern
    //
    //  Created by YouXianMing on 15/8/1.
    //  Copyright (c) 2015年 YouXianMing. All rights reserved.
    //
    
    #import "DecoratorGamePlay.h"
    
    @interface DecoratorGamePlay ()
    
    @property (nonatomic, strong) GamePlay  *gamePlay;
    
    @end
    
    @implementation DecoratorGamePlay
    
    #pragma mark - 初始化
    - (instancetype)init {
        
        self = [super init];
        if (self) {
        
            // 装饰对象包含一个真实对象的引用
            self.gamePlay = [GamePlay new];
        }
        
        return self;
    }
    
    #pragma mark - 让真实对象的引用执行对应的方法
    - (void)up {
    
        [_gamePlay up];
    }
    
    - (void)down {
    
        [_gamePlay down];
    }
    
    - (void)left {
    
        [_gamePlay left];
    }
    
    - (void)right {
    
        [_gamePlay right];
    }
    
    - (void)select {
    
        [_gamePlay select];
    }
    
    - (void)start {
    
        [_gamePlay start];
    }
    
    - (void)commandA {
    
        [_gamePlay commandA];
    }
    
    - (void)commandB {
    
        [_gamePlay commandB];
    }
    
    #pragma mark - 装饰器新添加的方法
    - (void)cheat {
    
        [_gamePlay up];
        [_gamePlay down];
        [_gamePlay up];
        [_gamePlay down];
        [_gamePlay left];
        [_gamePlay right];
        [_gamePlay left];
        [_gamePlay right];
        [_gamePlay commandA];
        [_gamePlay commandB];
        [_gamePlay commandA];
        [_gamePlay commandB];
    }
    
    @synthesize lives = _lives;
    - (NSInteger)lives {
    
        // 相关处理逻辑
        return 10;
    }
    
    @end

    分析

    以下是装饰模式实现细节对照图

  • 相关阅读:
    望图知意BlogPatrol又挂了
    看你知道不知道之-制作数据字典
    mount: none already mounted or /cgroup busy
    [zz]OpenStack中虚拟机的监控
    guestfs
    Ubuntu 10.04 wine 中运行某个门
    [zz]Wine完全使用指南——从基本到高级
    [zz]史上最快消息内核——ZeroMQ
    [zz]OpenStack Compute(Nova)功能分析
    [zz][技术] 完美使用 WINE 来运行 RTX ,QQ
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/4693606.html
Copyright © 2011-2022 走看看