当前位置: 首页 > wzjs >正文

梧州网站建设2k9网络团队提供高品质网站建设服务seo入门教程视频

梧州网站建设2k9网络团队提供高品质网站建设服务,seo入门教程视频,什么网站专门做境外当地游,上海公共招聘网对模板方法模式的理解 一、场景1、题目【[来源](https://kamacoder.com/problempage.php?pid1087)】1.1 题目描述1.2 输入描述1.3 输出描述1.4 输入示例1.5 输出示例 二、不采用模板方法模式1、代码2、问题 三、采用模板方法模式1、代码 四、总结 一、场景 1、题目【来源】 …

对模板方法模式的理解

    • 一、场景
      • 1、题目【[来源](https://kamacoder.com/problempage.php?pid=1087)】
        • 1.1 题目描述
        • 1.2 输入描述
        • 1.3 输出描述
        • 1.4 输入示例
        • 1.5 输出示例
    • 二、不采用模板方法模式
      • 1、代码
      • 2、问题
    • 三、采用模板方法模式
      • 1、代码
    • 四、总结

一、场景

1、题目【来源】

1.1 题目描述

小明喜欢品尝不同类型的咖啡,她发现每种咖啡的制作过程有一些相同的步骤,他决定设计一个简单的咖啡制作系统,使用模板方法模式定义咖啡的制作过程。系统支持两种咖啡类型:美式咖啡(American Coffee)和拿铁(Latte)。

咖啡制作过程包括以下步骤:

  1. 研磨咖啡豆 Grinding coffee beans
  2. 冲泡咖啡 Brewing coffee
  3. 添加调料 Adding condiments

其中,美式咖啡和拿铁的调料添加方式略有不同, 拿铁在添加调料时需要添加牛奶Adding milk

1.2 输入描述

多行输入,每行包含一个数字,表示咖啡的选择(1 表示美式咖啡,2 表示拿铁)。

1.3 输出描述

根据每行输入,输出制作咖啡的过程,包括咖啡类型和各个制作步骤,末尾有一个空行。

1.4 输入示例
1
2
1.5 输出示例
Making American Coffee:
Grinding coffee beans
Brewing coffee
Adding condimentsMaking Latte:
Grinding coffee beans
Brewing coffee
Adding milk
Adding condiments

二、不采用模板方法模式

1、代码

public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (scanner.hasNextInt()) {int n = scanner.nextInt();if (n == 1) {System.out.println("Making American Coffee:");System.out.println("Grinding coffee beans");System.out.println("Brewing coffee");System.out.println("Adding condiments");} else if (n == 2) {System.out.println("Making Latte:");System.out.println("Grinding coffee beans");System.out.println("Brewing coffee");System.out.println("Adding milk");System.out.println("Adding condiments");} else {throw new RuntimeException("must be 1 or 2");}System.out.println();}}
}

2、问题

  • 虽然是制作不同的咖啡,但制作过程中,有些步骤是一样的。因此,可以复用这些步骤,减少代码冗余。
  • 咖啡是抽象的,但美式咖啡、拿铁是具体的。很容易想到”抽象类-实现子类“这样的代码结构。在抽象类中规范步骤,子类去覆写细节。

三、采用模板方法模式

1、代码

  • 模板
public interface Coffee {CoffeeEnum gotCoffeeEnum();void create();
}public abstract class AbstractCoffee implements Coffee {@Overridepublic final void create() {System.out.printf("Making %s:%n", gotCoffeeEnum().getDesc());System.out.println("Grinding coffee beans");System.out.println("Brewing coffee");addCondiments();}protected void addCondiments() {System.out.println("Adding condiments");}
}
  • 实现类
@Getter
@AllArgsConstructor
public enum CoffeeEnum {AMERICAN_COFFEE("American Coffee", 1),LATTE("Latte", 2);private final String desc;private final int code;public static CoffeeEnum getCoffeeEnum(int code) {for (CoffeeEnum coffeeEnum : CoffeeEnum.values()) {if (coffeeEnum.getCode() == code) {return coffeeEnum;}}return null;}
}public class AmericanCoffee extends AbstractCoffee {@Overridepublic CoffeeEnum gotCoffeeEnum() {return CoffeeEnum.AMERICAN_COFFEE;}
}public class LatteCoffee extends AbstractCoffee {@Overridepublic CoffeeEnum gotCoffeeEnum() {return CoffeeEnum.LATTE;}@Overrideprotected void addCondiments() {System.out.println("Adding milk");System.out.println("Adding condiments");}
}
  • 外观模式,对各种Coffee的实现类进行封装:
public class CoffeeFacade {private List<Coffee> coffees;public CoffeeFacade() {this.coffees = new ArrayList<>();this.coffees.add(new AmericanCoffee());this.coffees.add(new LatteCoffee());}public void makeCoffee(int code) {coffees.stream().filter(coffee -> coffee.gotCoffeeEnum().getCode() == code).findFirst().ifPresent(Coffee::create);}
}
  • 客户端:
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);CoffeeFacade coffeeFacade = new CoffeeFacade();while (scanner.hasNextInt()) {int n = scanner.nextInt();coffeeFacade.makeCoffee(n);System.out.println();}}
}

四、总结

  • 在企业开发中,模板方法模式还是很常见的。通过分析需求,发现类与类的关系呈现下图所示,就可以在抽象类中定义通用步骤(模板),子类去覆写具体细节即可。

    image

  • 当然了,模板方法模式也存在一个明显的弊端:一旦某个实现类不适用当前模板了,不得不去修改抽象类的通用步骤时,便会影响现有实现类(复用的代价)。

  • 比较好的做法是,定义通用步骤时,步骤要足够抽象,而不能太具体太细了,这样可以给子类足够的灵活性。

http://www.dtcms.com/wzjs/20479.html

相关文章:

  • 用电脑怎么做网站创意营销
  • 注册一个免费的网站百度注册网站
  • 搜索引擎主要包括三个部分鄞州seo服务
  • 高端网站建设创新搜索引擎营销的主要模式有哪些
  • 桂林市住房和城乡建设委员会网站百度推广网站一年多少钱
  • 可以做拟合的在线网站推广app赚佣金
  • 有机蔬菜哪个网站做的更好怎么快速优化网站排名
  • 做软件需要网站吗郑州网络推广公司
  • 西安电脑网站建设怎么接app推广的单子
  • 手机网站seo教程怎么建企业网站
  • 品牌网站建设价格百度广告业务
  • 南通五建宏业建设工程有限公司网站优化网站做什么的
  • 大学专业宣传网站开发课题意义站长之家网站
  • 浏览器网站免费进入免费网站安全软件大全
  • 网站集约化建设调研报告品牌网站建设解决方案
  • 哪些网站做魔兽地图广州seo优化推广
  • 网站开发 图片储存友情链接检测659292
  • eclice网站开发微信营销推广软件
  • 用网站做淘宝客深圳推广平台有哪些
  • 大连网站建设兼职百度一下官网首页网址
  • 做app网站公司百度收录网站要多久
  • ui设计的网站网站优化关键词排名公司
  • 建设网站的可行性分析网站top排行榜
  • 建设工程施工合同(示范文本)seo点击工具
  • 软件开发的主要任务是宁波seo推广推荐
  • wordpress添加全屏海报百度seo搜索引擎优化
  • 西宁网站建设公司排行大连百度关键词排名
  • 哪家网站推广好百度非企推广开户
  • wordpress 两个搜索框seo营销优化
  • 做企业网站找谁百度怎么推广广告