Java模板设计模式与接口
Posted 王嘻嘻-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java模板设计模式与接口相关的知识,希望对你有一定的参考价值。
目录
开闭原则(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();
接口使用原则
- 接口中只有public权限,接口中只有全局常量和抽象方法,只有在接口内部abstract static final public都可以省略掉! ! ! (阿里编码规范中,定义接口,尽量简洁)。
public interface IMessage //全局常量 int NUM = 100; //抽象方法 String msg();
- 接口的多实现,接口没单继承限制,子类可以同时实现多个父接口。子类在实现多个父接口时,使用,分隔。子类就必须要实现父接口中所有抽象方法(子类是普通类)。
//子类实现多个父接口 public class MessageImpl implements IMessage,INews @Override public String msg() return "Hello World!"; @Override public 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 @Override public String msg() return "Hello World!"; @Override public 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.
-
子类若同时继承父类,实现接口。
请先试用extends继承一个父类,而后使用implements实现多个接口。
public class DTest extends D implements A,B
接口的应用场景
1.定义规范/标准
电脑是USB接口的使用者而非实现者(类的内部拥有USB接口对象)
Mouse和KeyBoard来说,为了让设备能通过USB线连接到电脑,就必须实现USB接口, USB的实现者。
//接口:表示定义或规范
//电脑是USB接口的使用者
public class Computer
//电脑上的USB插口1
public void plugIn1(USB port1)
port1.setUp();
port1.work();
//电脑上的USB插口2
public 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.表示一种能力/行为
篇幅有限,只展示测试类源代码👇
//接口:表示一种能力或者行为
public class Test
public static void main(String[] args)
Dog dog = new Dog("泰迪");
dog.run();
dog.eat("狗粮");
Frog frog = new Frog("小蛙");
frog.run();
frog.swim();
frog.eat("害虫");
Goose goose = new Goose("大鹅");
goose.fly();
goose.run();
goose.swim();
goose.eat("草");
PS:本章节所有源代码:
主要是接口表示一种能力和行为的例子源代码
模式结构设计以及接口表示定义及规范
本节完^_^
以上是关于Java模板设计模式与接口的主要内容,如果未能解决你的问题,请参考以下文章