YYPOST群发软件 发表于 5 天前

安卓脚本多变的function用法

安卓脚本多变的function用法


//🍎交流QQ群711841924群一,苹果内测群,528816639

/**
* =============================================================================
* AIWROK 高级函数封装库 - 实用案例集
* =============================================================================
* 本文件展示更复杂、多变的 function 用法,包括:
* 1. 闭包与私有变量
* 2. 高阶函数与函数组合
* 3. 递归与记忆化
* 4. 工厂模式与构造函数
* 5. 异步处理与回调
* 6. 装饰器模式
* 7. 观察者模式
* 8. 链式调用
*/

// =============================================================================
// 1. 闭包与私有变量 - 创建安全的计数器
// =============================================================================

/**
* 创建安全计数器(使用闭包保护内部状态)
* @returns {Object} 计数器对象
*/
function createSecureCounter() {
    var count = 0; // 私有变量
   
    return {
      increment: function() {
            count++;
            console.log('计数器增加: ' + count);
            return count;
      },
      decrement: function() {
            if (count > 0) {
                count--;
                console.log('计数器减少: ' + count);
            } else {
                console.log('计数器已为最小值');
            }
            return count;
      },
      getCount: function() {
            return count;
      },
      reset: function() {
            count = 0;
            console.log('计数器重置');
            return count;
      }
    };
}

// =============================================================================
// 2. 高阶函数 - 函数作为参数和返回值
// =============================================================================

/**
* 通用重试机制(高阶函数)
* @param {Function} fn - 要执行的函数
* @param {number} maxRetries - 最大重试次数
* @param {number} delay - 重试间隔(毫秒)
* @returns {*} 函数执行结果
*/
function withRetry(fn, maxRetries, delay) {
    var attempts = 0;
   
    function execute() {
      attempts++;
      try {
            console.log('尝试执行第 ' + attempts + ' 次...');
            var result = fn();
            console.log('执行成功!');
            return result;
      } catch (e) {
            console.log('执行失败: ' + e.message);
            if (attempts < maxRetries) {
                console.log(delay + 'ms 后重试...');
                Sleeper.millisecond(delay);
                return execute();
            } else {
                throw new Error('达到最大重试次数: ' + maxRetries);
            }
      }
    }
   
    return execute();
}

/**
* 函数组合器(类似数学中的 f(g(x)))
* @param {...Function} functions - 要组合的函数列表
* @returns {Function} 组合后的函数
*/
function compose() {
    var funcs = Array.prototype.slice.call(arguments);
   
    return function(value) {
      var result = value;
      for (var i = funcs.length - 1; i >= 0; i--) {
            result = funcs(result);
      }
      return result;
    };
}

/**
* 管道函数(从左到右执行)
* @param {...Function} functions - 要管道的函数列表
* @returns {Function} 管道后的函数
*/
function pipe() {
    var funcs = Array.prototype.slice.call(arguments);
   
    return function(value) {
      var result = value;
      for (var i = 0; i < funcs.length; i++) {
            result = funcs(result);
      }
      return result;
    };
}

// =============================================================================
// 3. 递归与记忆化 - 优化重复计算
// =============================================================================

/**
* 带记忆化的斐波那契数列计算
* @param {number} n - 第n个斐波那契数
* @returns {number} 斐波那契数值
*/
function fibonacciMemoized() {
    var cache = {}; // 缓存对象
   
    function fib(n) {
      if (n in cache) {
            return cache;
      }
      
      if (n <= 1) {
            return n;
      }
      
      cache = fib(n - 1) + fib(n - 2);
      return cache;
    }
   
    return fib;
}

/**
* 递归目录遍历(模拟)
* @param {string} path - 路径
* @param {number} depth - 当前深度
* @param {number} maxDepth - 最大深度
*/
function traverseDirectory(path, depth, maxDepth) {
    if (depth > maxDepth) {
      return;
    }
   
    console.log(''.repeat(depth) + '├── ' + path);
   
    // 模拟子目录
    var subDirs = ['docs', 'src', 'config'];
    for (var i = 0; i < subDirs.length; i++) {
      traverseDirectory(path + '/' + subDirs, depth + 1, maxDepth);
    }
}

// =============================================================================
// 4. 工厂模式 - 动态创建对象
// =============================================================================

/**
* UI组件工厂
* @returns {Object} 组件工厂对象
*/
function createUIFactory() {
    var components = {};
   
    return {
      /**
         * 注册组件模板
         * @param {string} name - 组件名称
         * @param {Function} template - 组件模板函数
         */
      register: function(name, template) {
            components = template;
            console.log('组件 [' + name + '] 已注册');
      },
      
      /**
         * 创建组件实例
         * @param {string} name - 组件名称
         * @param {Object} options - 配置选项
         * @returns {Object} 组件实例
         */
      create: function(name, options) {
            if (!components) {
                throw new Error('未找到组件: ' + name);
            }
            
            console.log('创建组件 [' + name + ']');
            return components(options);
      },
      
      /**
         * 获取所有已注册组件
         * @returns {Array} 组件名称列表
         */
      getRegisteredComponents: function() {
            return Object.keys(components);
      }
    };
}

/**
* 按钮组件模板
* @param {Object} options - 配置选项
* @returns {Object} 按钮对象
*/
function buttonTemplate(options) {
    return {
      type: 'button',
      text: options.text || '按钮',
      onClick: options.onClick || function() {},
      render: function() {
            console.log('[按钮] ' + this.text);
      }
    };
}

/**
* 输入框组件模板
* @param {Object} options - 配置选项
* @returns {Object} 输入框对象
*/
function inputTemplate(options) {
    return {
      type: 'input',
      placeholder: options.placeholder || '请输入...',
      value: '',
      onChange: options.onChange || function() {},
      render: function() {
            console.log('[输入框] 占位符: ' + this.placeholder);
      }
    };
}

// =============================================================================
// 5. 异步处理 - 模拟异步操作
// =============================================================================

/**
* 异步任务管理器
* @returns {Object} 任务管理器
*/
function createAsyncManager() {
    var tasks = [];
    var isRunning = false;
   
    return {
      /**
         * 添加任务
         * @param {Function} task - 任务函数
         * @param {string} name - 任务名称
         */
      addTask: function(task, name) {
            tasks.push({
                func: task,
                name: name || ('Task_' + tasks.length),
                status: 'pending'
            });
            console.log('任务 [' + name + '] 已添加');
      },
      
      /**
         * 顺序执行所有任务
         */
      runSequentially: function() {
            if (isRunning) {
                console.log('任务正在运行中...');
                return;
            }
            
            isRunning = true;
            console.log('========== 开始顺序执行任务 ==========');
            
            for (var i = 0; i < tasks.length; i++) {
                var task = tasks;
                console.log('执行任务 [' + task.name + '] (' + (i + 1) + '/' + tasks.length + ')');
               
                try {
                  task.func();
                  task.status = 'completed';
                  console.log('✓ 任务 [' + task.name + '] 完成');
                } catch (e) {
                  task.status = 'failed';
                  console.log('✗ 任务 [' + task.name + '] 失败: ' + e.message);
                }
               
                Sleeper.millisecond(500); // 模拟延迟
            }
            
            isRunning = false;
            console.log('========== 所有任务执行完毕 ==========');
      },
      
      /**
         * 获取任务状态
         * @returns {Array} 任务状态列表
         */
      getStatus: function() {
            return tasks.map(function(task) {
                return {
                  name: task.name,
                  status: task.status
                };
            });
      }
    };
}

// =============================================================================
// 6. 装饰器模式 - 增强函数功能
// =============================================================================

/**
* 日志装饰器
* @param {Function} fn - 原函数
* @param {string} name - 函数名称
* @returns {Function} 装饰后的函数
*/
function withLogging(fn, name) {
    return function() {
      console.log('>>> 调用函数: ' + name);
      console.log('    参数: ' + JSON.stringify(Array.prototype.slice.call(arguments)));
      
      var start = new Date().getTime();
      var result = fn.apply(this, arguments);
      var duration = new Date().getTime() - start;
      
      console.log('<<< 函数 ' + name + ' 执行完成,耗时: ' + duration + 'ms');
      console.log('    返回值: ' + JSON.stringify(result));
      
      return result;
    };
}

/**
* 缓存装饰器
* @param {Function} fn - 原函数
* @returns {Function} 带缓存的函数
*/
function withCaching(fn) {
    var cache = {};
   
    return function() {
      var key = JSON.stringify(Array.prototype.slice.call(arguments));
      
      if (key in cache) {
            console.log('命中缓存: ' + key);
            return cache;
      }
      
      console.log('计算并缓存: ' + key);
      var result = fn.apply(this, arguments);
      cache = result;
      return result;
    };
}

/**
* 节流装饰器
* @param {Function} fn - 原函数
* @param {number} delay - 延迟时间(毫秒)
* @returns {Function} 节流后的函数
*/
function throttle(fn, delay) {
    var lastCall = 0;
   
    return function() {
      var now = new Date().getTime();
      if (now - lastCall >= delay) {
            lastCall = now;
            return fn.apply(this, arguments);
      } else {
            console.log('节流: 忽略调用');
      }
    };
}

// =============================================================================
// 7. 观察者模式 - 事件系统
// =============================================================================

/**
* 创建事件总线
* @returns {Object} 事件总线对象
*/
function createEventBus() {
    var listeners = {};
   
    return {
      /**
         * 订阅事件
         * @param {string} event - 事件名称
         * @param {Function} callback - 回调函数
         */
      on: function(event, callback) {
            if (!listeners) {
                listeners = [];
            }
            listeners.push(callback);
            console.log('订阅事件: ' + event);
      },
      
      /**
         * 取消订阅
         * @param {string} event - 事件名称
         * @param {Function} callback - 回调函数
         */
      off: function(event, callback) {
            if (!listeners) return;
            
            var index = listeners.indexOf(callback);
            if (index > -1) {
                listeners.splice(index, 1);
                console.log('取消订阅事件: ' + event);
            }
      },
      
      /**
         * 发布事件
         * @param {string} event - 事件名称
         * @param {*} data - 事件数据
         */
      emit: function(event, data) {
            if (!listeners) {
                console.log('无监听者: ' + event);
                return;
            }
            
            console.log('发布事件: ' + event);
            listeners.forEach(function(callback) {
                try {
                  callback(data);
                } catch (e) {
                  console.log('事件回调错误: ' + e.message);
                }
            });
      },
      
      /**
         * 一次性订阅
         * @param {string} event - 事件名称
         * @param {Function} callback - 回调函数
         */
      once: function(event, callback) {
            var self = this;
            var wrapper = function(data) {
                callback(data);
                self.off(event, wrapper);
            };
            this.on(event, wrapper);
      }
    };
}

// =============================================================================
// 8. 链式调用 - 流畅API
// =============================================================================

/**
* 创建字符串处理器(支持链式调用)
* @param {string} str - 初始字符串
* @returns {Object} 处理器对象
*/
function createStringProcessor(str) {
    var value = str || '';
   
    return {
      /**
         * 转大写
         * @returns {Object} 自身(支持链式调用)
         */
      toUpperCase: function() {
            value = value.toUpperCase();
            return this;
      },
      
      /**
         * 转小写
         * @returns {Object} 自身
         */
      toLowerCase: function() {
            value = value.toLowerCase();
            return this;
      },
      
      /**
         * 去除空格
         * @returns {Object} 自身
         */
      trim: function() {
            value = value.trim();
            return this;
      },
      
      /**
         * 替换文本
         * @param {string} search - 搜索文本
         * @param {string} replace - 替换文本
         * @returns {Object} 自身
         */
      replace: function(search, replace) {
            value = value.replace(new RegExp(search, 'g'), replace);
            return this;
      },
      
      /**
         * 追加文本
         * @param {string} text - 追加文本
         * @returns {Object} 自身
         */
      append: function(text) {
            value += text;
            return this;
      },
      
      /**
         *prepend 文本
         * @param {string} text - 前置文本
         * @returns {Object} 自身
         */
      prepend: function(text) {
            value = text + value;
            return this;
      },
      
      /**
         * 获取结果
         * @returns {string} 处理后的字符串
         */
      getResult: function() {
            return value;
      },
      
      /**
         * 打印结果
         * @returns {Object} 自身
         */
      log: function() {
            console.log('当前值: "' + value + '"');
            return this;
      }
    };
}

// =============================================================================
// 工具函数
// =============================================================================

/**
* 延迟工具函数
*/
var Sleeper = {
    millisecond: function(ms) {
      var start = new Date().getTime();
      while (new Date().getTime() - start < ms) {
            // 等待
      }
    },
    second: function(seconds) {
      this.millisecond(seconds * 1000);
    }
};

/**
* 倒计时显示函数
* @param {number} seconds - 倒计时秒数
* @param {string} prefix - 前缀文本
*/
function countdown(seconds, prefix) {
    prefix = prefix || '等待';
    for (var i = seconds; i > 0; i--) {
      console.log(prefix + '... ' + i + '秒');
      Sleeper.second(1);
    }
    console.log(prefix + '... 开始!');
    Sleeper.millisecond(500); // 短暂停顿
}

// =============================================================================
// 演示函数
// =============================================================================

/**
* 演示1: 闭包计数器
*/
function demoClosure() {
    countdown(2, '【演示1】即将开始');
    console.log('========== 演示1: 闭包计数器 ==========');
   
    var counter = createSecureCounter();
    counter.increment();
    counter.increment();
    counter.increment();
    console.log('当前计数: ' + counter.getCount());
    counter.decrement();
    counter.reset();
   
    console.log('');
}

/**
* 演示2: 高阶函数
*/
function demoHigherOrder() {
    countdown(2, '【演示2】即将开始');
    console.log('========== 演示2: 高阶函数 ==========');
   
    // 重试机制
    var successCount = 0;
    var retryResult = withRetry(function() {
      successCount++;
      if (successCount < 3) {
            throw new Error('模拟失败');
      }
      return '成功!';
    }, 5, 100);
    console.log('重试结果: ' + retryResult);
   
    // 函数组合
    var addOne = function(x) { return x + 1; };
    var multiplyTwo = function(x) { return x * 2; };
    var composed = compose(multiplyTwo, addOne);
    console.log('组合函数结果 (先+1再*2): ' + composed(5)); // (5+1)*2 = 12
   
    // 管道
    var piped = pipe(addOne, multiplyTwo);
    console.log('管道函数结果 (先+1再*2): ' + piped(5)); // (5+1)*2 = 12
   
    console.log('');
}

/**
* 演示3: 递归与记忆化
*/
function demoRecursion() {
    countdown(2, '【演示3】即将开始');
    console.log('========== 演示3: 递归与记忆化 ==========');
   
    var fib = fibonacciMemoized();
    console.log('斐波那契数列前10项:');
    for (var i = 0; i < 10; i++) {
      console.log('F(' + i + ') = ' + fib(i));
    }
   
    console.log('\n目录遍历示例:');
    traverseDirectory('root', 0, 2);
   
    console.log('');
}

/**
* 演示4: 工厂模式
*/
function demoFactory() {
    countdown(2, '【演示4】即将开始');
    console.log('========== 演示4: 工厂模式 ==========');
   
    var factory = createUIFactory();
    factory.register('button', buttonTemplate);
    factory.register('input', inputTemplate);
   
    var btn = factory.create('button', {
      text: '提交',
      onClick: function() { console.log('按钮被点击'); }
    });
    btn.render();
   
    var inp = factory.create('input', {
      placeholder: '请输入用户名'
    });
    inp.render();
   
    console.log('已注册组件: ' + factory.getRegisteredComponents().join(', '));
   
    console.log('');
}

/**
* 演示5: 异步任务管理
*/
function demoAsync() {
    countdown(2, '【演示5】即将开始');
    console.log('========== 演示5: 异步任务管理 ==========');
   
    var manager = createAsyncManager();
   
    manager.addTask(function() {
      console.log('任务1: 初始化数据');
    }, '初始化');
   
    manager.addTask(function() {
      console.log('任务2: 加载配置');
    }, '加载配置');
   
    manager.addTask(function() {
      console.log('任务3: 连接服务器');
    }, '连接服务器');
   
    manager.runSequentially();
   
    var status = manager.getStatus();
    console.log('任务状态:');
    status.forEach(function(s) {
      console.log('' + s.name + ': ' + s.status);
    });
   
    console.log('');
}

/**
* 演示6: 装饰器模式
*/
function demoDecorator() {
    countdown(2, '【演示6】即将开始');
    console.log('========== 演示6: 装饰器模式 ==========');
   
    // 日志装饰
    var originalFunc = function(a, b) {
      return a + b;
    };
    var loggedFunc = withLogging(originalFunc, '加法函数');
    var result = loggedFunc(10, 20);
    console.log('结果: ' + result);
   
    // 缓存装饰
    var expensiveCalc = function(n) {
      Sleeper.millisecond(100); // 模拟耗时计算
      return n * n;
    };
    var cachedCalc = withCaching(expensiveCalc);
   
    console.log('第一次调用:');
    cachedCalc(5);
    console.log('第二次调用(应命中缓存):');
    cachedCalc(5);
   
    console.log('');
}

/**
* 演示7: 观察者模式
*/
function demoObserver() {
    countdown(2, '【演示7】即将开始');
    console.log('========== 演示7: 观察者模式 ==========');
   
    var bus = createEventBus();
   
    // 订阅事件
    bus.on('dataUpdate', function(data) {
      console.log('监听者1收到数据: ' + JSON.stringify(data));
    });
   
    bus.on('dataUpdate', function(data) {
      console.log('监听者2收到数据: ' + JSON.stringify(data));
    });
   
    // 一次性订阅
    bus.once('onceEvent', function(data) {
      console.log('一次性监听者收到: ' + data);
    });
   
    // 发布事件
    bus.emit('dataUpdate', { value: 100, timestamp: new Date().getTime() });
    bus.emit('onceEvent', '测试数据');
    bus.emit('onceEvent', '再次触发(应该无响应)');
   
    console.log('');
}

/**
* 演示8: 链式调用
*/
function demoChaining() {
    countdown(2, '【演示8】即将开始');
    console.log('========== 演示8: 链式调用 ==========');
   
    var result = createStringProcessor('hello world')
      .trim()
      .toUpperCase()
      .replace('WORLD', 'AIWROK')
      .append(' - 欢迎使用')
      .prepend('【')
      .append('】')
      .log()
      .getResult();
   
    console.log('最终结果: ' + result);
   
    console.log('');
}

/**
* 主函数 - 运行所有演示
*/
function main() {
    console.log('========================================');
    console.log('AIWROK 高级函数封装库 - 实用案例集');
    console.log('========================================');
    console.log('');
   
    countdown(2, '程序启动');
   
    demoClosure();
   
    demoHigherOrder();
   
    demoRecursion();
   
    demoFactory();
   
    demoAsync();
   
    demoDecorator();
   
    demoObserver();
   
    demoChaining();
   
    console.log('========================================');
    console.log('所有演示已完成!');
    console.log('========================================');
}

// 执行主函数
main();

页: [1]
查看完整版本: 安卓脚本多变的function用法