设计模式之装饰器模式

1.装饰器模式

namespace a {
    interface Animal {
        swings: number;
        fly: Function;
    }
    // 如果装饰器用来 装饰他的类的话 那么 target 就是他的构造函数
    function flyable(target: any) {
        target.propetype.swings = 2;
        target.propetype.fly = function() {
            console.log("我能起飞了");
        };
    }

    @flyable
    class Animal {
        constructor() {

        }
    }

    let _animal: Animal = new Animal();
    console.log(_animal.swings);
    console.log(_animal.fly());
}

namespace a {

    interface Animal {
        swings: number;
        fly: Function;
    }
    // 如果传参的话 这个就是可以拿到他的参数值
    function flyable(swings: any) {
        return function flyable(target: any) {
                target.propetype.swings = swings;
                target.propetype.fly = function() {
                    console.log("我能起飞了");
                };
        }
    }

    @flyable(5)
    class Animal {
        constructor() {

        }
    }

    let _animal: Animal = new Animal();
    console.log(_animal.swings);
    console.log(_animal.fly());
}

装饰器可以定义的类型
我们可以拿到这里的 参数做响应的处理, 可以自己写一些简单的装饰器, 也可以使用别人写好的装饰器

namespace a {
    
    // 实例target 的类型的构造对象, key 是该实例的名字
    function instancePropertyDecorator(target, key) {
        target.propeName = "我是原型链上的属性";
        // target.propeName 其实就是在 Circle 定义了一个 名字propeName 的实例, 因为 target 是类型的构造对象
    }

    // 类的静态实例target 的类型的构造对象, key 是该实例的名字
    function classPropertyDecorator(target, key) {

    }

    // 实例方法的target是类的原型, key 是该实例的名字, decriptor是属性描述符
    function instanceMethodDecorator(target, key, decriptor) {

    }

    // 静态实例方法的target是类的原型, key 是该实例的名字, decriptor是属性描述符
    function classmethodDecorator(target, key, decriptor) {

    }

    class Circle {
        // 这里 我们给他 添加装饰器
        @instancePropertyDecorator
        instanceProperty: string; // 实例shu属性

        @classPropertyDecorator
        static classProperty: string; // 静态属性
        
        @instanceMethodDecorator
        instanceMethod() { // 实例方法

        }

        @classmethodDecorator
        static classmethod() { //静态方法

        }

        // 上面的 target.propeName = "我是原型链上的属性"; 就相当于下面的这个意思
        // Circle.propetype.propeName = "我是原型链上的属性";
    }
}

推荐一个装饰器的包, core-decorators 到这里去, 这个包里面 有别人写了很多 很好的装饰器, 可以使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值