js 策略模式

需求

有一个请款单列表需要查看详情, 但是每一个请款单的类型都可能是不同的, 不同的请款单需要做不同的操作

实现

先定义一个Detail

map作为一个参数中转

将传入的参数经过一定的规则映射之后变成具体的方法名称

我这里的参数简单只做了简单的处理,如果业务逻辑更简单也可以直接把方法名称作为参数传入

拿到具体的方法名称之后,就可以把方法名称作为strategieskey调用这个方法了

Detail

  • map方法
    • Detail的私有方法,外部不可调用。用于适应外部的各种参数,最终返回 strategies对象key
  • strategies对象
    • Detail的私有对象,外部不可调用。存储着实际执行的方法,key为方法名称
  • checkDetail方法
    • Detail的对外开放的方法,new Detail()之后方可调用
  • type参数
    • Detail的参数,是map方法的参数,如果不传,会有一个默认值
function Detail(type) {
        //映射,将传入的参数映射成对应的方法名
        var map = function (innerType) {
            return {
                'A请款': 'aPay',
                'B请款': 'bPay',
                'C请款': 'cPay',
                '暂无详情': 'noDetail'
            }[innerType ? innerType : type];
        }

        //具体的查看请款详情的方法集合
        var strategies = {
            aPay() {
                alert('A...');
            },
            bPay() {
                alert('B...');
            },
            cPay() {
                alert('C...');
            },

            noDetail() {
                alert('暂无详情');
            }
        }

        //Detail对象对外开放的方法,根据映射调用具体的方法
	//new Detail 时候如果给Detail传入了参数,调用map()后会使用这个参数
        this.checkDetail = function () {
            strategies[map()] ? strategies[map()]() : strategies[map('暂无详情')]();
        }
    }

调用

new Detail().checkDetail(); //alert('暂无详情')
new Detail('A请款').checkDetail(); //alert('A...');

——完——

posted @ 2021-03-31 16:43  _戈多  阅读(53)  评论(0编辑  收藏  举报