ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式之模板方法

2022-05-02 20:33:10  阅读:103  来源: 互联网

标签:void System Override println 设计模式 方法 public 模板 out


使用场景

这个设计模式一般在最初写代码的时候基本上是不会预先想到的,都是在后期不断重构的过程中被提炼出来的。简单来说就是:当你发现你写了两个或者多个几乎一毛一样的类,只是有些方法的实现方式不一致的时候,你就要停下来想想了,如果你又发现在使用这些类的地方调用方法顺序都一样,不要犹豫请使用模板方法模式重构吧。

第一步:先定义一个模板类LivePlay,如下代码片段所示,其中的seeLivePlay()就是所谓的模板方法,为了不被子类overwrite,它被设置为final的,其定义了一个算法骨架。 其中的login()是一个实体方法,里面是通用逻辑,所有的子类都是一样的。四个被abstract修饰的是抽象方法,这些方法是需要子类去根据自己的实际算法实现的,而pushVideoStream()方法有一个默认的空实现,这个一般称为钩子方法,设计用来被其中部分需要的子类overwrite. 例如腾讯直播SDK提供了旁路推流的功能,而金山的没有提供,那么腾讯直播类就可以选择overwrite这个钩子方法,提供自己的实现。

package templae;

/**
 * @author wmd
 * @date 2022/5/2
 * 模板方法
 */
public abstract  class LivePlay {
    // 模板方法
    public final void seelivePlay() {
        // 定义流程
        login();
        openRoom();
        startAudioAndVideoStream();
        pushVideoStream();
        stopAudioAndVideoStream();
        closeRoom();
        
    }

    private void login() {
        System.out.println("用户登录");
    }

    protected abstract void closeRoom();

    protected abstract void stopAudioAndVideoStream();


    protected abstract void startAudioAndVideoStream();

    protected abstract void openRoom();



    /*钩子方法,可以被需要的子类overwrite*/
    //旁路推流,可以通过视频链接在浏览器中查看视频
    public void pushVideoStream() {

    }
}

//定义具体的实现类
class TencentLivePlay extends LivePlay {
    @Override
    protected void closeRoom() {
        System.out.println("腾讯关闭房间");

    }

    @Override
    protected void stopAudioAndVideoStream() {
        System.out.println("腾讯关闭音视频流");
    }

    @Override
    protected void startAudioAndVideoStream() {
        System.out.println("腾讯打开音视频流");

    }

    @Override
    protected void openRoom() {
        System.out.println("腾讯打开房间");
    }
    //覆写钩子方法,提供旁路推流功能
    @Override
    public void pushVideoStream() {
        super.pushVideoStream();
        System.out.println("腾讯进行旁路推流\"");
    }

}

//金山直播类
 class JinShanLivePlay extends LivePlay  {
    @Override
    public void openRoom() {
        System.out.println("金山打开房间");
    }

    @Override
    public void startAudioAndVideoStream() {
        System.out.println("金山打开音视频流");
    }

    @Override
    public void stopAudioAndVideoStream() {
        System.out.println("金山关闭音视频流");
    }

    @Override
    public void closeRoom() {
        System.out.println("金山关闭房间");
    }
}

class TemplateMethodTest{
    public static void main(String[] args) {
        LivePlay TlivePlay = new TencentLivePlay();
        TlivePlay.seelivePlay();
        LivePlay JlivePlay = new JinShanLivePlay();
        JlivePlay.seelivePlay();
    }
}

 

优点

主要是提高了代码的复用度,而且很好的符合的“开闭原则”。

 

 

 

 

 

 

 

 

 

 

缺点

  1. 设计模式的通病:类增多了
  2. 调用控制反转:一般情况下,程序的执行流是子类调用父类的方法,模板方法模式使得程序流程变成了父类调用子类方法,这个使得程序比较难以理解和跟踪。总结
  3. 模板方法模式很好的提现了好莱坞原则:Don't call us, we'll call you。

总结

模板方法模式很好的提现了好莱坞原则:Don't call us, we'll call you

 

标签:void,System,Override,println,设计模式,方法,public,模板,out
来源: https://www.cnblogs.com/wmdshijie/p/16216705.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有