再起航,我的学习笔记之JavaScript设计模式17(模板方法模式)

模板方法模式

由模板方法模式开始我们正式告别结构型设计模式,开始行为型设计模式的学习分享

行为型设计模式用于不同对象之间职责划分或算法抽象,行为型设计模式不仅仅涉及类和对象,还涉及类或对象之间的交流模式并加以实现

模板方法模式(Template Method): 父类中定义一组操作算法骨架,而将一些实现步骤延迟到子类中,使得子类可以不改变父类的算法结构的同时可重新定义算法中某些实现步骤。

总的来说模板方法模式就是将多个模型抽象化归一,从中抽象提取出来一个最基本的模板,然后其他模块只需要继承这个模板方法,也可以拓展某些方法。

下面我们用一个提示框例子来开始本次的分享吧:

创建模板

模板类

var Alert = function(data) {
    //如果没有数据则返回,防止后面程序执行
    if(!data) return;
    //设置内容
    this.content = data.content;
    //创建提示框面板
    this.panel = document.createElement('div');
    //创建提示内容组件
    this.contentNode = document.createElement('p');
    //创建确定按钮组件
    this.confirmBtn = document.createElement('span');
    //创建关闭按钮组件
    this.closeBtn = document.createElement('b');
    //为提示框面板添加类
    this.panel.className = 'alert';
    //为关闭按钮添加类
    this.closeBtn.className = 'a-close';
    //为确定按钮添加类
    this.confirmBtn.className = 'a-confirm button blue';
    //为确认按钮添加显示名称
    this.confirmBtn.innerHTML = data.confirm || '确定';
    //为提示内容添加文本
    this.contentNode.innerHTML = this.content;
    //为点击确定方法绑定执行方法
    this.success = data.success || function() {};
    //点击关闭按钮执行方法
    this.fail = data.fail || function() {};
}

添加原型

Alert.prototype = {
    //初始化方法
    init: function() {
        //生成提示框
        this.panel.appendChild(this.closeBtn);
        this.panel.appendChild(this.contentNode);
        this.panel.appendChild(this.confirmBtn);
        //插入页面
        document.body.appendChild(this.panel);
        //绑定事件
        this.bindEvent();
        //显示提示框
        this.show();
    },
    bindEvent: function() {
        var me=this;
        //关闭按钮事件
        this.closeBtn.onclick = function() {
            //执行关闭取消方法
            me.fail();
            //隐藏弹层
            me.hide();
        }
        //确定按钮事件
        this.confirmBtn.onclick = function() {
            //执行关闭确认方法
            me.success();
            //隐藏弹层
            me.hide();
        }
    },
    hide:function(){
        this.panel.style.display='none';
    },
    show:function(){
        this.panel.style.display='block';
    }
}

拓展

至此我们的提示框基类就创建完毕了,拓展起来也很简单,我们试着拓展一个标题提示框

var TitleAlert=function(data){
    //继承基本提示框
    Alert.call(this,data);
    //设置标题内容
    this.title=data.title;
    //创建标题组件
    this.titleNode=document.createElement('h3');
    //标题组件中写入标题内容
    this.titleNode.innerHTML=this.title;
}
//继承基本提示框方法
TitleAlert.prototype=new Alert();
//对基本提示框创建方法拓展
TitleAlert.prototype.init=function(){
    //插入标题
    this.panel.insertBefore(this.titleNode,this.panel.firstChild);
    //继承基本提示框init方法
    Alert.prototype.init.call(this);
}

我们来试着调用一下

new TitleAlert({
    title:'提示标题',
    content:'提示内容',
    success:function(){
        alert('您点击了确定');
    }
}).init()

总结

模板方法的核心在于对方法的重用,它将核心方法封装在基类中,让子类继承基类的方法,实现基类方法的共享,达到方法公用。当然这种设计模式也将导致基类控制子类必须准守某些法则。这是一种行为的约束。当然为了让行为的约束更可靠,基类中封装的方法通常是不变的算法,或者有稳定的调用方式。子类继承的方法也是可以拓展的,这就要求对基类继承的方法进行重写。当然为了更好地实践,我们通常需要控制这种拓展,这样才能让基类对子类有更稳健的束缚力。然而子类对自身私有行为的拓展还是很有必要的。

也谢谢大家看到这里:)如果你觉得我的分享还可以请点击推荐,分享给你的朋友让我们一起进步~

好了以上就是本次分享的全部内容,本次示例参考自JavaScript设计模式一书,让我们一点点积累一点点成长,希望对大家有所帮助。

欢迎转载,转载请注明作者,原文出处。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: m/n逻辑是一种启示式的推理方法,常用于知识库的推理。该方法的基本思想是:设想有一个知识库,包含m个真实前提和n个假设条件。我们可以使用这些前提和条件,来推导出一些新的结论。 该方法起航方法包括以下几个步骤: 1. 确定前提和假设条件。首先,我们需要确定知识库的前提和假设条件。这些前提和条件需要具有客观性和可信度,才能作为推理的基础。 2. 分析前提和条件。将前提和条件进行分析,找出它们之间的关系和内在的逻辑联系。这样就可以为后续的推理提供一个基础。 3. 建立一个模型。在推理过程,我们需要建立一个模型来描述前提和条件之间的逻辑关系。这个模型可以是一个流程图、一个逻辑模型或者一个数学模型。 4. 进行推理。根据模型,我们可以开始进行推理。推理的过程可以是演绎推理、归纳推理或概率推理。我们可以使用不同的方法来验证和推导结论。 5. 验证结论。推理的结果需与前提和条件相符,才能被认为是有效的结论。因此,我们需要对结论进行验证和分析,确定它们是否合理。 基于m/n逻辑的起航方法可以帮助我们在知识库进行推理和决策。它可以为我们提供一个合理和有效的推理框架,帮助我们更好地理解和应用知识。 ### 回答2: 基于m/n逻辑的起航方法是一种将决策过程简化为一系列二选一的策略的方法。其,m表示在选项组必须选择的选项数量,n表示选项组的总选项数量。 该方法的步骤如下: 1. 确定决策目标和要考虑的因素。 2. 构建选项组。这些选项应该都满足决策目标和考虑的因素。 3. 确定m和n的值。m值应根据要做出的决策和选项组的大小而定,通常在3至5之间。n值应根据选项组的大小而定,通常在6至10之间。 4. 对每个m个选项的子组进行评估。评估应基于决策目标和考虑的因素,并将每个子组的总分数记录下来。 5. 选出得分最高的子组作为决策结果。 该方法的优点是简单易行,易于理解和操作,可以在较短的时间内得出可靠的决策结果。缺点是该方法仅适用于简单情况下的决策,对于复杂的决策问题可能无法提供足够的信息。因此,该方法最适用于简单的、非常规的、小型的决策问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值