上一篇为大家介绍了一下关于模板方法模式的实现,后来我发现里面有一点小瑕疵,本篇重新为大家介绍一下关于模板方法模式的实现。另外为大家分享一下关于策略模式的实现。

 一、模板方法模式:

  对于上一篇为大家介绍的实现方法,大家是否有这样的疑问,如果哪位用户说,我要一杯清茶,不要加柠檬,这时我们饮料机该如何操作呢?为了解决这个问题,我们需要引入一个钩子方法,用来达到我们是否加柠檬的操作。

  1、饮料机类:

  1. /*
  2. * 模板方法模式
  3. */
  4. public abstract class Robot {
  5.  
  6. public final void runRobot(){
  7. ZhuShui();
  8. Chong();
  9. DaoShui();
  10. if(flag()){
  11. Add();
  12. }
  13. }
  14.  
  15. //添加的钩子方法
  16. public boolean flag(){
  17. return true;
  18. }
  19.  
  20. //基本方法把水煮沸
  21. public void ZhuShui(){
  22. System.out.println("把水煮沸");
  23. }
  24.  
  25. public void Chong(){
  26. System.out.println("加咖啡或茶");
  27. }
  28.  
  29. //基本方法倒入杯子中
  30. public void DaoShui(){
  31. System.out.println("把饮料倒入杯子中");
  32. }
  33.  
  34. public void Add(){
  35. System.out.println("加奶或柠檬");
  36. }
  37. }

  2、清茶类:

  1. public class Tea extends Robot {
  2.  
  3. public void Add() {
  4. System.out.println("加柠檬");
  5. }
  6.  
  7. public void Chong() {
  8. System.out.println("冲泡茶叶");
  9. }
  10.  
  11. public boolean flag(){
  12. return false;
  13. }
  14.  
  15. }

  3、测试类:

  1. public class Test {
  2.  
  3. /**
  4. * @param 模板方法模式测试
  5. */
  6. public static void main(String[] args) {
  7. Robot robot1 = new Coffer();
  8. robot1.runRobot();
  9.  
  10. System.out.println("**********************");
  11.  
  12. Robot robot2 = new Tea();
  13. robot2.runRobot();
  14.  
  15. }
  16.  
  17. }

  到这里关于模板方法模式添加钩子方法的实现就介绍完毕,大家可以自行测试,如有疑问请留言。


  二、策略模式的实现:

  策略模式是什么呢?下面我就为大家讲一个小东西,方便大家理解,比如你的公司现在要开发做一个关于鸭子的项目,其中会出现很多鸭子,有会飞的、有不会飞的、有做火箭飞的,如何来保证我们添加这些特性是不受影响呢?就可以用到我们的策略模式,我们使用接口封装一下飞这个特性,然后通过父类对象调用这个接口,并实行其中飞的方法,这样子类在继承父类时,便可以继承到父类的这个方法。

  1、创建Dark父类对象:

  1. public abstract class Dark {
  2.  
  3. public String name;
  4.  
  5. public void getName() {
  6. System.out.println("我的名字是:"+name);
  7. }
  8.  
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12.  
  13. public void Say(){
  14. System.out.println("嘎嘎嘎嘎");
  15. }
  16.  
  17. public abstract void backGround();
  18.  
  19. flayIm flay;
  20.  
  21. public void setFlay(flayIm flay) {
  22. this.flay = flay;
  23. }
  24.  
  25. public void getFlay(){
  26. flay.Flay();
  27. }
  28.  
  29. }

  2、添加一个封装了飞这个特性的接口方法:

  1. public interface flayIm {
  2. public void Flay();
  3. }

  3、创建实现了该接口的方法:

    a、会飞的:

  1. public class Flay implements flayIm {
  2.  
  3. public void Flay() {
  4. System.out.println("我用翅膀飞行");
  5. }
  6.  
  7. }

    b、不会飞的:

  1. public class noFlay implements flayIm {
  2.  
  3. public void Flay() {
  4. System.out.println("我不会飞行");
  5. }
  6.  
  7. }

  4、鸭子对象:

    a、红色羽毛的鸭子对象:

  1. public class redDark extends Dark {
  2.  
  3. public void backGround() {
  4. System.out.println("我的羽毛是红颜色的");
  5. }
  6.  
  7. }

    b、黑色羽毛的鸭子对象:

  1. public class blankDark extends Dark {
  2.  
  3. public void backGround() {
  4. System.out.println("我是羽毛是黑色的");
  5. }
  6.  
  7. }

    c、大黄鸭对象:

  1. public class bigYellowDark extends Dark {
  2.  
  3. public void Say(){
  4. System.out.println("嘎~嘎~嘎~嘎~");
  5. }
  6.  
  7. public void backGround() {
  8. System.out.println("我没有羽毛");
  9. }
  10.  
  11. }

  5、测试类:

  1. public class DarkTest {
  2.  
  3. /**
  4. * @param 测试类对象
  5. */
  6. public static void main(String[] args) {
  7. Dark mredDark = new redDark();
  8. Dark mblankDark = new blankDark();
  9. Dark mbigDark = new bigYellowDark();
  10. flayIm flay = new Flay();
  11. flayIm noflay = new noFlay();
  12. mredDark.setName("小红鸭");
  13. mredDark.getName();
  14. mredDark.setFlay(flay);
  15. mredDark.Say();
  16. mredDark.backGround();
  17. mredDark.getFlay();
  18. System.out.println("***********************");
  19. mblankDark.setName("小黑鸭");
  20. mblankDark.getName();
  21. mblankDark.setFlay(flay);
  22. mblankDark.Say();
  23. mblankDark.backGround();
  24. mblankDark.getFlay();
  25. System.out.println("***********************");
  26. mblankDark.setName("大黄鸭");
  27. mblankDark.getName();
  28. mblankDark.setFlay(noflay);
  29. mblankDark.Say();
  30. mblankDark.backGround();
  31. mblankDark.getFlay();
  32.  
  33. }
  34.  
  35. }

  好了,到这里我们的策略模式就介绍完毕,下一篇:设计模式中的适配器、工厂、代理模式

  

JAVA设计模式《三》的更多相关文章

  1. Java 设计模式(四)-工厂方法模式 (FactoryMethod Pattern)

    1     概念定义 1.1   定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 1.2   类型 创建类模式 2     原理特征 2.1   类 ...

  2. Java 设计模式系列(十四)命令模式(Command)

    Java 设计模式系列(十四)命令模式(Command) 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复 ...

  3. Java 设计模式之建造者模式(四)

    原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...

  4. 深入探索Java设计模式(四)之享元模式

    享元模式适用于需要大量相同类型对象的情况.在此,设计布局可以减少创建多个对象的方式.对象在运行时会消耗资源,因此最好在内存中使用较少的对象.它减少了内存占用并利用了程序的整体性能.本文是在学习完优锐课 ...

  5. 【白话设计模式四】单例模式(Singleton)

    转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...

  6. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

  7. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  8. Java设计模式(二) 工厂方法模式

    本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...

  9. Java设计模式(一) 简单工厂模式不简单

    摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...

  10. Java设计模式(十三) 别人再问你设计模式,叫他看这篇文章

    原创文章,转载请务注明出处 OOP三大基本特性 封装 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类操作,对不可信的进行信息隐藏. 继承 继承是指这样一种能力,它可以使 ...

随机推荐

  1. js实现单文件以及多文件下载

    <script type="text/javascript"> /** * Javascript 多文件下载 * @author Barret Lee * @email ...

  2. MVC3/4伪静态 jexus mvc伪静态

    第一步修改RouteConfig.cs文件 public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute ...

  3. arm v5,v6,v7?

    http://blog.csdn.net/woshi_ziyu/article/details/7946862

  4. 解决Ubuntu发热量大的问题

    转自:http://blog.csdn.net/tracker_w/article/details/8801971 用Ubuntu 的朋友应该都有体会,开机不久风扇就开始狂转,本本也会很热.据说是双显 ...

  5. React Native也正式发布了

    var React = require('react-native'); var { TabBarIOS, NavigatorIOS } = React; var App = React.create ...

  6. Java虚拟机4:内存溢出

    堆溢出 Java堆唯一的作用就是存储对象实例,只要保证不断创建对象并且对象不被回收,那么对象数量达到最大堆容量限制后就会产生内存溢出异常了.所以测试的时候把堆的大小固定住并且让堆不可扩展即可.测试代码 ...

  7. [翻译]docker生态圈Mindmap

    Docker是一个开源的Linux容器,其被业界所接受,很快成为了一个产业标准.Docker可以减少应用程序启动 时候的大量资源的筹备.docker很快的成为了新兴的应用程序容器标准.现在有很多项目正 ...

  8. Nim教程【十四】

    网友@沉没捕鱼,赞助了一台服务器 这个系列的教程写完之后,我们就要开始着手搭建Nim的社区了~ 异常 Nim中的异常类型是对象类型 根据惯例,Nim中的异常类型的命名都应该以Error后缀结尾 在sy ...

  9. 浅谈Excel开发:四 Excel 自定义函数

    我们知道,Excel中有很多内置的函数,比如求和,求平均,字符串操作函数,金融函数等等.在有些时候,结合业务要求,这些函数可能不能满足我们的需求,比如我想要一个函数能够从WebService上获取某只 ...

  10. C#Lite Unity热更新开源解决方案改名C#Light

    因为此脚本语言与C#Lite Framework 开源项目重名,故修改名称,发音不变.