目录

一、星巴克咖啡冲泡法

二、星巴克茶冲泡法

三、模板设计模式

超类实现

子类实现

测试类

四、接口

接口使用原则

接口的应用场景

1.定义规范/标准

2.表示一种能力/行为

PS:本章节所有源代码:

主要是接口表示一种能力和行为的例子源代码

模式结构设计以及接口表示定义及规范


开闭原则(OCP): 一个软件实体如类、模块和函数应该对扩展开放、对修改关闭。

开闭原则是Java世界中最基础的设计原则。

模版设计模式是抽象类的一个实际应用场景,讲模板设计模式之前,我们先来看一下星巴克咖啡冲泡师傅的训练手册。

一、星巴克咖啡冲泡法

1. 将水煮沸 2. 用沸水冲泡咖啡 3. 将咖啡倒进杯子 4. 加糖和牛奶

范例:冲泡咖啡类

    //一键启动按钮,点这个按钮就可以做出一杯咖啡public void prepareRecipe(){boilWater();//烧水brewCoffeeBag();//把咖啡泡在水中pourInCup();//把咖啡倒在顾客杯子里addSugarAndMilk();//添加糖和牛奶}private void addSugarAndMilk() {System.out.println("adding sugar and milk");}private void pourInCup() {System.out.println("pouring coffee into cup");}private void brewCoffeeBag() {System.out.println("brewing coffee bag");}private void boilWater() {System.out.println("boiling water");}
}

二、星巴克茶冲泡法

1. 将水煮沸    2. 用沸水浸泡茶叶      3. 把茶倒进杯子       4. 加柠檬

范例:冲泡茶类

    public void prepareRecipe(){boilWater();//烧水steepTeaBag();//将茶包泡在水里pourInCup();//将泡好的茶倒入顾客杯子addLemon();//加柠檬}private void addLemon() {System.out.println("adding lemon into tea");}private void pourInCup() {System.out.println("pouring tea into cup");}private void steepTeaBag() {System.out.println("steeping tea bag");}private void boilWater() {System.out.println("boiling water...");}
}

三、模板设计模式

我们在这两个类中发现了重复代码,因此我们需要重新理一下我们的设计。 既然茶和咖啡是如此的相似,因此我们应该将共同的部分抽取出来,放进一个基类中。

实际上,浸泡(steep)和冲泡(brew)差异并不大。因此我们给它一个新的方法名称brew(),这样我们无论冲泡 的是何种饮料都可以使用这个方法。同样的,加糖、牛奶还是柠檬也很相似,都是在饮料中加入其它调 料,因此我们也给它一个通用名称addCondiments()。重新设计后通用的prepareRecipe()方法如下:

void prepareRecipe() {boilWater();brew();pourInCup();addCondiments();
}

下面我们来分别实现超类(引入"钩子"方法)与子类。

超类实现

public abstract class CaffeineBeverage {//制作流程是标准化,封装到父类中//子类只有使用权不能修改public final void prepareRecipe(){boilWater();brew();pourInCup();
//        addCondiments();if (isCustomerWantsCondiments()){addCondiments();}}//对于浸泡和加调味品来说,不同于子类实现细节不同,延迟到子类中和去具体实现public abstract void brew();public abstract void addCondiments();public void pourInCup(){System.out.println("pouring into cup");}public void boilWater(){System.out.println("boiling water");}/*** 钩子方法* 超类中通常是默认实现* 子类可以选择性的覆写此方法* @return*/public boolean isCustomerWantsCondiments(){return true;}
}

现在我们需要处理茶和咖啡类了。这两个类现在都是依赖超类来处理冲泡流程,因此只需要各自处理冲 泡和加调料部分即可。

子类实现

//咖啡
public class Coffee extends CaffeineBeverage {Scanner scanner = new Scanner(System.in);public void brew(){System.out.println("brew coffee bag");}public void addCondiments(){System.out.println("add sugar and milk");}public boolean isCustomerWantsCondiments(){System.out.println("你想要加糖和牛奶嘛?y表示加,n表示不加");String str = scanner.nextLine();if (str.equals("y")){return true;}return false;}
}//泡茶法
public class Tea extends CaffeineBeverage{public void brew(){System.out.println("steep tea bag");}public void addCondiments(){System.out.println("add lemon");}
}

测试类

public class Test {public static void main(String[] args) {CaffeineBeverage coffee = new Coffee();coffee.prepareRecipe();System.out.println("————————————");CaffeineBeverage tea = new Tea();tea.prepareRecipe();}
}

四、接口

现实生活中的"接口" : USB接口.
Java中使用interface关键字定义接口,接口中只有全局常量和抽象方法(JDK8之前,JDK8扩 展了default方法)
子类使用implements实现接口;一般接口的命名使用I开头和类做区分;子类实现接口可以使用impl结尾,表示是接口的子类。

//interface 定义了 IMessage
public interface IMessage {//全局常量public static final int NUM = 100;//抽象方法public String msg();
}

接口使用原则

  1. 接口中只有public权限,接口中只有全局常量和抽象方法,只有在接口内部abstract static final public都可以省略掉! ! ! (阿里编码规范中,定义接口,尽量简洁)。

    public interface IMessage {//全局常量int NUM = 100;//抽象方法String msg();
    }
  2. 接口的多实现,接口没单继承限制,子类可以同时实现多个父接口。子类在实现多个父接口时,使用,分隔。子类就必须要实现父接口中所有抽象方法(子类是普通类)。
    //子类实现多个父接口
    public class MessageImpl implements IMessage,INews {@Overridepublic String msg() {return "Hello World!";}@Overridepublic void getNews() {System.out.println("The news is true.");}
    }

    接口可以使用extends来继承多个父接口

    //接口的多继承
    interface A{void testA();
    }interface B{void testB();
    }
    interface C extends A,B{void testC();
    }

    接口仍然不能直接实例化对象,必须通过子接口来向上转型。message只能调用msg方法;
    不能调用getNews-(INews接口定义)。

    public class MessageImpl implements IMessage,INews {@Overridepublic String msg() {return "Hello World!";}@Overridepublic void getNews() {System.out.println("The news is true.");}public static void main(String[] args) {//父类/父接口父引用= new子类实例();IMessage message = new MessageImpl();System.out.println(message.msg());//Hello World!INews news = (INews) message;news.getNews();//The news is true.}
    }
  3. 子类若同时继承父类,实现接口。
    请先试用extends继承一个父类,而后使用implements实现多个接口。

public class DTest extends D implements A,B{}

接口的应用场景

1.定义规范/标准

电脑是USB接口的使用者而非实现者(类的内部拥有USB接口对象)
Mouse和KeyBoard来说,为了让设备能通过USB线连接到电脑,就必须实现USB接口, USB的实现者。

//接口:表示定义或规范
//电脑是USB接口的使用者
public class Computer {//电脑上的USB插口1public void plugIn1(USB port1){port1.setUp();port1.work();}//电脑上的USB插口2public void plugIn2(USB port2){port2.setUp();port2.work();}public static void main(String[] args) {Computer computer = new Computer();computer.plugIn1(new Mouse());computer.plugIn2(new Keyboard());}
}

2.表示一种能力/行为

篇幅有限,只展示测试类源代码

Java模板设计模式与接口相关推荐

  1. Java 设计模式 --- Template 模式 Java Template 模式 Java 模板设计模式

    Java 设计模式 --- Template 模式 Java Template 模式 Java 模板设计模式 一.概述 模板设计模式: 父类定义通用抽象的功能方法,子类负责具体的实现. 本文将以一个通 ...

  2. Java笔记018-抽象类、抽象类最佳实践-模板设计模式、接口、内部类

    目录 抽象类 先看一个问题 小结: 抽象类快速入门 抽象类的介绍 抽象类使用的注意事项和细节讨论 抽象类练习题 抽象类最佳实践-模板设计模式 基本介绍 模板设计模式能解决的问题 最佳实践 最佳实践 接 ...

  3. Java模板设计模式

    模板设计模式: 在编写代码时,要经常检查代码是否有问题,开闭原则是我们最常见最基本的原则. 开闭原则(OCP):一个软件实体:比如类.模块.函数等,应该对扩展开放,对修改关闭. 设计模式的关键在于第三 ...

  4. 模板设计模式,简单Java代码实现

    /**模板设计模式:定义一个算法的骨架,而将具体的算法延迟到子类中进行实现* 优点:* 使用模板方法模式,在定义算法骨架的同时,可以很灵活地实现具体的算法,满足用户灵活多变的需求* 缺点:* 如果算法 ...

  5. java 抽象属性 设计_Java 抽象类与模板设计模式详解

    抽象类 抽象类是为了方法覆写而提供的类结构,因为其无法自身直接进行对象实例化操作,所以在实际应用中,抽象类主要目的是进行过程操作使用,当你要使用抽象类进行开发的时候,往往都是在你设计中需要解决类继承问 ...

  6. java 模板接口开发_微信公众平台 发送模板消息(Java接口开发)

    前言:最近一直再弄微信扫码推送图文消息和模板消息发送,感觉学习到了不少东西.今天先总结一下微信公众平台模板消息的发送.因为这个自己弄了很久,开始很多地方不明白,所以今天好好总结一下. 微信公众平台技术 ...

  7. 【26天高效学完Java编程】Day11:继承、抽象类、模板设计模式详解

    本专栏将从基础开始,循序渐进,由浅入深讲解Java的基本使用,希望大家都能够从中有所收获,也请大家多多支持. 专栏地址:26天高效学习Java编程 相关软件地址:软件地址 所有代码地址:代码地址 如果 ...

  8. Java抽象类(abstract)的定义和设计模式(模板设计模式)

    1.抽象类 package com.itstudy.bean;//抽象类/*** 抽象类:描述的内容不是具体的内容* 1.有abstract修改,并且有抽象方法* 2.一共类中有抽象方法,那么这个类一 ...

  9. Java——抽象类+模板设计模式

    目录 1.抽象类介绍 2.抽象类细节 3.抽象类细节02 4.抽象类实例(员工问题) test01.java Employee.java Manager.java CommonEmployee.jav ...

最新文章

  1. Python之初识函数(Day11)
  2. Readline-select
  3. 一个简单问题引发对IEnumerable和IQueryable的思考
  4. 你可能不需要固定词表:一种与词表无关的组合式词向量方法
  5. 用servlet校验密码2
  6. Elasticsearch 索引容量管理实践
  7. python的argparse模块parse_known_args()方法的使用
  8. 华为鸿蒙OS用户今年底或达2亿 将发布自研鸿蒙编程语言
  9. jQuery Mobile 学习资料
  10. 好好的虚拟机不能用了, 出现无法打开内核设备\\.\Global\vmx86: 系统找不到指定的文件的错误, 以下是网上找到的解决方法,亲测可用...
  11. [杂谈] 9. C语言中getch()函数
  12. Java常量池简单认识
  13. 光伏工程cad计算机软件,4.23MWp光伏发电示范工程全套电气施工cad图纸
  14. 计算机软硬件基本知识总结,计算机软硬件基础知识.doc
  15. 【人工智能AI】AI写作:《怎样成为一个优秀的架构师》
  16. html网页页面制作用到了什么技术,技术干货|常用的HTML5网页制作软件,这些你有在用吗?...
  17. JQuery插件之-----Datatables(三)Datatables实现多选框与AJAX返回数据
  18. 2021-01-20
  19. .net开发网站CMS博客框架
  20. linux 时钟同步

热门文章

  1. 前三季度净利润超三年总和,比亚迪新能源汽车业务全面爆发
  2. 手把手带你写一份优秀的开发求职简历(六)工作经历的亮点突出
  3. Jupyter Notebook:简介
  4. 【小5聊】Vue开发环境配置(Windows)
  5. 飞天云动开启招股:首日认购超5倍 商汤与浙江安吉是基石投资者
  6. springboot Vue java火车票查询预订票管理系统介绍
  7. OI常用的数学知识大全(持续更新)
  8. RFM模型原理详解与实操运用
  9. 深入理解SSL VPN
  10. 扩展c盘时,如何删除恢复分区