在前一篇文章 桥接模式与策略模式的区别 与刘伟老师的 桥接模式 中,我们可以明白桥接模式处理得比较好的一个点是在于 Java的反射机制

那么,假如我们需要再TypeScript中,来实现桥接模式的处理,需要怎么样来实现这个“反射”呢?

注:在策略模式中,该文章的处理全部适用。

反射机制:就是要实现通过一个Key值来创建一个类。

那么在TypeScript中,普通的对象就有key:value的这样的格式,然后TypeScript编译后的源代码是JavaScript,而JS的类创建是通过原型对象来创建的。所以可以利用这样的关系,把TypeScrip中的类(在JS中变现为原型对象),保存在一个普通对象里。

注:普通对象可以用例子变现为:let ClassStorage= {};其中ClassStorage就是我们所说的普通对象。

实现思路需要的类

代理类:ProxyClass,来实现从Key转化为具体对象的类。

存储类:StorageClass,用来保存我们的类。

这两个类是实现桥接模式中,反射机制的核心。

然后接下来,需要有模拟桥接模式的测试类,来完成桥接模式的闭环。

测试类:Test,用来通过反射调用不同的类。

被调用基类:ClassBase,定义接口,在Test类中调用。

被调用派生类:***Classs,定义具体行为。

ProxyClass.ts:

import { ClassStorage } from "./ClassStorage"; export class ProxyClass { * 代理构建方法 * @param className 动态类名称 * @param option 动态类创建参数 static getClass(className: string, option?: any) { //一个简单的异常判断,如果存储类中不存在此类 则抛出异常提醒 if (ClassStorage[className] === undefined || ClassStorage[className] === null) { console.warn(`未找到 className:${className} 对应实现`); return null; //从存放对象上找出对应class 创建即可 return new (ClassStorage[className])(option) static checkValidClass(className: string) { //一个简单的异常判断,如果存储类中不存在此类 则抛出异常提醒 if (ClassStorage[className] === undefined || ClassStorage[className] === null) { return null; //从存放对象上找出对应class 创建即可 return className

ClassStorage.ts:

export let ClassStorage: any = {};

Test.ts:

import { ClassBase } from "./ClassBase";
import { ProxyClass } from "./ProxyClass";
export class Test {
    constructor() {
        // 因为创建的是ProxyClass 类型 所以需要 as 进行类型断言
        // 这样ts就可以进行友好提示了!
        this.createClass("AClass");
        this.createClass("BClass");
        this.createClass("CClass");
    createClass(type: string): ClassBase {
        let a: ClassBase = new ProxyClass(type);
        a.test();

ClassBase.ts:

export abstract class ClassBase {
    abstract test(): void;

AClass.ts:

import { ClassStorage } from "./ClassStorage";
import { ClassBase } from "./ClassBase";
export class AClass extends ClassBase {
    test(): void {
        console.log("this is AClass");
ClassStorage["AClass"] = AClass;

BClass.ts:

import { ClassStorage } from "./ClassStorage";
import { ClassBase } from "./ClassBase";
export class BClass extends ClassBase {
    test(): void {
        console.log("this is BClass");
ClassStorage["BClass"] = BClass;

CClass.ts:

import { ClassStorage } from "./ClassStorage";
import { ClassBase } from "./ClassBase";
export class CClass extends ClassBase {
    test(): void {
        console.log("this is CClass");
ClassStorage["CClass"] = CClass;
用于TypeScript应用程序的反射型模型。 有两种主要模型: 原始模型,它是可序列化的格式(考虑使用从TypeScript包或项目中生成此格式)。 对型的引用存储为{moduleName:string,name:string}对象。 完全解析的模型,其中所有引用都替换为该型的实际实例。 这是最有用的模型。 该库中模块的高级概览: rawConverter:将原始模型转换为解析模型。 模型:包含原始模型和解析模型的型元模型 factory:由rawConverter使用。 包含用于创建解析的模型元素的代码 equals:包含用于解析模型的相等函数 typeCloser:具有型参数的元素(,接口等)被视为型构造函数。 要创建实际型,请使用带有参数的typeCloser作为参数 typeUtils:一些有用的处理型的函数 如何动态创建Typescript?前言思路图代码User 如何动态的创建class (调用示例)ProxyClass 实现一个代理(具体实现)Storage 实现不同的class存放(具体实现)注意 想做一个工厂模式,之前写JAVA的时候使用“反射”可以轻松的完成动态创建,使用TypeScript的时候发现突然不知道怎么下手了!于是查阅各种资料 也没有找到理想的答案! 现如今得到了一... 下面先确认对象有hello方法,然后再通过Reflect.get获得该方法并调用。2.对象深浅克隆方法实现。4.通过反射调用实例方法。3.实例化对象并克隆。1.定义基与派生。 装饰器(也叫注解)对一个/方法/属性/参数的装饰。它是对这一系列代码的增强,并且通过自身描述了被装饰的代码可能存在行为改变。 装饰器是一种特殊型的声明,它能够被附加到声明,方法, 访问符,属性或参数上。 装饰器使用 @expression这种形式,expression求值后必须为一个函数,它会在运行时被调用,被装饰的声明信息做为参数传入。 装饰器分为:装饰器、方法装饰器、属性装饰器、参数装饰器 要使用装饰器需要在tsconfig.json中配置: "compilerOptio 以前在js中书写是这样的,然后我们在加上TS的型检查你会发现报错了为什么呢?在TS中他认为你这样写代码不是很好,因为在TS中你把User这个写出来以后,它里面有哪些属性和方法,你应该很清楚的知道,所以TS认为你这些属性应该单独在一个地方写,而不是使用构造函数constructor动态的创造数据,在js中是可以使用构造函数取动态添加数据,而在TS中是不允许的,TS认为在创建一个对象后是不允许取给对象添加属性的,由于动态添加属性,可能会存在一些隐患,所以TS是不允许我们动态添加属性的。... 在程序中可以检查某个中的方法属性等信息,并且能够动态调用。 反射的基本用法: 1、要把一个对象中的数据copy到另外一个对象中,规则是属性名相同就copy,用反射来做,不需要指定每个属性的名字,只要动态从中取得信息,再判断属性名是否相同即可。 2、可以在程序上动态创建实例对象,并调用它的方法、属性。 反射的优点: 提升程序的灵活性和扩展性,降低模块的耦合度。 反射的缺点 最近逛GitHub看到大神sindresorhus 新出的on-change对象数组监听库。看了下代码,基于proxy实现。于是顺便研究一下es6中的proxy和reflect。 最近在开发过程中,由于部分常量配置在接口而非枚举中,当我们需要通过属性名去获取具体接口中常量对应的值时,或是要获取该接口中所有常量名和对应值的键值对集合,显得有些麻烦或是无从下手,故这里封装一个通用的工具来满足此需求(扩展到和对象中),做以下总结。 大致思路:定义 ReflectObjectUtil 工具,通过反射获取或对象信息,并将对应信息组装,按照要求的格... 生活中,对象是一个具体的事物,比如:你的电脑、你的手机、古力娜扎、周杰伦(周董)等都是对象。但在程序员的认知中万物皆对象。这些具体的事物,都有自己的特征和行为:你的电脑:尺寸、重量、价格等你的手机:品牌、屏幕大小、颜色等古力娜扎:年龄、身高、三围等你的电脑:浏览网页、写代码等你的手机:播放视频、吃鸡等古力娜扎:演电影、配音等TypeScript 中的对象,是对生活中具体事物的抽象,使得我们可以通过代码来描述具体的事物。 TypeScript 是面向对象的 JavaScript。描述了所创建的对象共同的属性和方法。定义的关键字为 class,后面紧跟名,可以包含以下几个模块(的数据成员): 在 TypeScript 里,我们可以使用常用的面向对象模式。 基于的程序设计中一种最基本的模式是允许使用继承来扩展现有的。 访问修饰符 public (共有的,默认为共有的) 在上面的例子里,我们可以自由的访问程序里定义的成员。 如果你对其它语言中的比较了解,就会注意到我们在之前的代码里并没有使用 来做修饰;例如 简介:本篇博客对于TS的开发思想面向对象编程和基本语法、构造函数、继承、抽象、接口、中属性的封装和泛型进行简单的介绍,并列举使用的实例代码以供参考。借此博客也对于近一个星期所学习关于TypeScript进行一个简单的总结归纳。 一、什么是面向对象编程? JavaScript是yi'm首先我们来说一说面向过程的编程语言,这是一种编程思维,是以过程为中心的编程。主要的特点是先分析出解决问题需要的步骤,然后把每一步定义成一个一个方法,通过逐个调用的方式来完成整个功能。这样的好处是十分直...