Java模板设计模式与接口

Posted 王嘻嘻-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java模板设计模式与接口相关的知识,希望对你有一定的参考价值。

目录

一、星巴克咖啡冲泡法

二、星巴克茶冲泡法

三、模板设计模式 

超类实现

子类实现

测试类 

 四、接口

接口使用原则

接口的应用场景

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 
        @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.
        
    
  3. 子类若同时继承父类,实现接口。
    请先试用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模板设计模式与接口的主要内容,如果未能解决你的问题,请参考以下文章

接口测试基础--柠檬不萌!

java设计模式模板模式

Java模板设计模式与接口

Java入门——面向对象基础

设计模式-建造者模式JAVA实现

使用postman做接口测试----柠檬不萌!