设计模式是一种思维,不是一组规则(1)

java中具体的23中设计模式的介绍,可以参考:http://c.biancheng.net/design_pattern/

里面讲解的挺详细的,但是“专业的”词语用的太多,并不利于我们接触和了解设计模式以及为什么要存在设计模式。 

不开心

模板方法模式,为什么要存在,解决了编程中的什么问题?

举个例子:《中国好声音》舞台中,参赛选手经过层层选拔,最终有人获得冠军。比赛还没有开始时,我们不知道谁参加了比赛,谁在初赛中唱了什么歌,半决赛中唱了什么歌,是否有被淘汰等等。但是选手必须过了初赛,才可以进入半决赛,过了半决赛才可以进入决赛。这个流程是确定的,也是选手必须经历的。其实这就是一个比赛的“模板”。

/**
 * @Author river66
 * @Date 2020/11/8 7:24
 */
public abstract class ChinaVoice {

    protected abstract boolean preliminaryContest(Singer singer);

    protected abstract boolean semifinals(Singer singer);

    protected abstract boolean finalsContest(Singer singer);
    
    // 开始比赛
    public void startTheGame(Singer singer) {
        // 是否过了初赛
        if (preliminaryContest(singer)) {
            // 是否过了半决赛
            if (semifinals(singer)) {
                // 是否过了决赛
                if (finalsContest(singer)) {
                    System.out.println("中国好声音的冠军是" + singer.toString());
                } else {
                    System.out.println(singer.toString() + "在决赛被淘汰!");
                }
            } else {
                System.out.println(singer.toString() + "在半决赛被淘汰!");
            }
        } else {
            System.out.println(singer.toString() + "在初赛被淘汰!");
        }
    }
}

比赛没有开始,我们不知道的具体实现,则把它定义为抽象方法。到了开始比赛的时候,再去实现具体的逻辑。这个是23中设计模式中唯一一个必须用到抽象类的一个模式(也可以用interface的默认方法来实现),它的存在是为了解决一些已经有了具体的步骤却不知道具体实现的场景

开心的杰伦

 

代理模式中jdk的动态代理,就要求代理的目标必须是要实现接口的,具体原因可参考:https://www.jianshu.com/p/ee9582c00eda

 有了动态代理(jdk自带或者spring的cglib动态代理),才有了现在的面向切面编程,背后的思维就是在不改变原有代码的基础上,在其前后加入新的处理逻辑

送快递

 工厂模式中,我们要使用工厂给我们生成的产品,往往都是比较重量级的对象或者生成对象的逻辑比较复杂的,我们不愿意花非常多的时间浪费在创建对象这个事情上面去。例如:Mybatis中的Sqlsession,需要去读取配置文件,还要去连接数据源,才能得到一个可用的Sqlsession对象。所以就有了SqlSessionFactory。你只要设计代码的时候,出发点是为了方便得到一个对象的,那就是工厂模式,并不一定要严格按照工厂方法模式或者抽象工厂模式的结构去设计的。

冒烟工厂

责任链模式中,我们关注的重点是在“链”这个字上面,链表大家都知道,本对象中会有一个引用指向下一个同类型的对象上。既然是同类型的,我们就会想到使用同一个接口来持有对象的引用。而这个“责任”,也就是等待当前节点处理的业务逻辑,如果当前节点不能够处理此逻辑,由当前节点负责调用下一个节点处理此逻辑的方法(是否想到了过滤器呢~)。

排队体检

/**
 * @Author river66
 * @Date 2020/11/8 9:15
 */
@Data
public abstract class Doctor {
    Doctor nextDoctor;

    /**
     * 检查病人
     *
     * @param checkForm 体检表
     * @return 执行检查返回true,未执行返回false
     */
    abstract boolean examineThePatient(String checkForm);
}

篇幅原因,未完待续~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值