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

 一、模板方法模式:

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

  1、饮料机类:

/*
* 模板方法模式
*/
public abstract class Robot { public final void runRobot(){
ZhuShui();
Chong();
DaoShui();
if(flag()){
Add();
}
} //添加的钩子方法
public boolean flag(){
return true;
} //基本方法把水煮沸
public void ZhuShui(){
System.out.println("把水煮沸");
} public void Chong(){
System.out.println("加咖啡或茶");
} //基本方法倒入杯子中
public void DaoShui(){
System.out.println("把饮料倒入杯子中");
} public void Add(){
System.out.println("加奶或柠檬");
}
}

  2、清茶类:

public class Tea extends Robot {

    public void Add() {
System.out.println("加柠檬");
} public void Chong() {
System.out.println("冲泡茶叶");
} public boolean flag(){
return false;
} }

  3、测试类:

public class Test {

    /**
* @param 模板方法模式测试
*/
public static void main(String[] args) {
Robot robot1 = new Coffer();
robot1.runRobot(); System.out.println("**********************"); Robot robot2 = new Tea();
robot2.runRobot(); } }

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


  二、策略模式的实现:

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

  1、创建Dark父类对象:

public abstract class Dark {

    public String name;

    public void getName() {
System.out.println("我的名字是:"+name);
} public void setName(String name) {
this.name = name;
} public void Say(){
System.out.println("嘎嘎嘎嘎");
} public abstract void backGround(); flayIm flay; public void setFlay(flayIm flay) {
this.flay = flay;
} public void getFlay(){
flay.Flay();
} }

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

public interface flayIm {
public void Flay();
}

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

    a、会飞的:

public class Flay implements flayIm {

    public void Flay() {
System.out.println("我用翅膀飞行");
} }

    b、不会飞的:

public class noFlay implements flayIm {

    public void Flay() {
System.out.println("我不会飞行");
} }

  4、鸭子对象:

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

public class redDark extends Dark {

    public void backGround() {
System.out.println("我的羽毛是红颜色的");
} }

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

public class blankDark extends Dark {

    public void backGround() {
System.out.println("我是羽毛是黑色的");
} }

    c、大黄鸭对象:

public class bigYellowDark extends Dark {

    public void Say(){
System.out.println("嘎~嘎~嘎~嘎~");
} public void backGround() {
System.out.println("我没有羽毛");
} }

  5、测试类:

public class DarkTest {

    /**
* @param 测试类对象
*/
public static void main(String[] args) {
Dark mredDark = new redDark();
Dark mblankDark = new blankDark();
Dark mbigDark = new bigYellowDark();
flayIm flay = new Flay();
flayIm noflay = new noFlay();
mredDark.setName("小红鸭");
mredDark.getName();
mredDark.setFlay(flay);
mredDark.Say();
mredDark.backGround();
mredDark.getFlay();
System.out.println("***********************");
mblankDark.setName("小黑鸭");
mblankDark.getName();
mblankDark.setFlay(flay);
mblankDark.Say();
mblankDark.backGround();
mblankDark.getFlay();
System.out.println("***********************");
mblankDark.setName("大黄鸭");
mblankDark.getName();
mblankDark.setFlay(noflay);
mblankDark.Say();
mblankDark.backGround();
mblankDark.getFlay(); } }

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

  

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. bash和Bourne_shell的区别

    Linux 中的 shell 有很多类型,其中最常用的几种是: Bourne shell (sh).C shell (csh) 和 Korn shell (ksh), 各有优缺点.Bourne she ...

  2. Teamcenter 2007 "由于某些意外的 DBMS 错误失败"

    PLM系统实施过程中经常需要做整个系统的克隆备份.Teamcenter2007在做基于Oracel的系统克隆时,用exp功能导出数据表,部署在目标机器上时会遇到DBMS错误,导致后续DB写操作无法进行 ...

  3. testng参数化及用例排序

    http://blog.sina.com.cn/s/blog_6966650401012ra0.html 一.一个简单的测试谷歌搜索 import org.testng.annotations.Tes ...

  4. 工作随笔——UIButton的EdgeInsets + Swift中的正则表达式;

    1.UIButton的EdgeInsets UIButton的EdgeInsets方法,是用来设置title和image对于上左下右四个方向的偏移,但是很奇怪的是,刚开始只有Image,titile也 ...

  5. 搜索栏css代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. Top ShooterHDU2863&&继续xxx定律HDU3784

    继续xxx定律 HDU3784 先看这个题目:HDU3782 #include<iostream> #include<algorithm> #include<stdio. ...

  7. iOS Wi-Fi

    查漏补缺集是自己曾经做过相关的功能,但是重做相关功能或者重新看到相关功能的实现,感觉理解上更深刻.这一类的文章集中记录在查漏补缺集. iOS 开发中难免会遇到很多与网络方面的判断,这里做个汇总,大多可 ...

  8. idlcpp 功能改进

    最近没有续写 idlcpp 的教程, 因为忙着对它进行大幅度的修改. 一开始本是计划用idlcpp对付新写的代码,让这些新写的代码能够很容易提供给脚本使用.后来又希望能将大量现存的代码移植过来,毕竟有 ...

  9. 使用knockout-sortable实现对自定义菜单的拖拽排序

    在开始之前,照例,我们先看效果和功能实现. 关于自定义菜单的实现,这里就不多说了,需要了解的请访问:http://www.cnblogs.com/codelove/p/4838766.html 这里需 ...

  10. 收录.NET跨平台及跨数据库的博文...

    本帖,将持续收录.NET跨平台及跨数据库的博文... VS2012+EF6+Mysql配置心路历程: http://www.cnblogs.com/gameman/p/3773240.html ASP ...