博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA设计模式《三》
阅读量:5218 次
发布时间:2019-06-14

本文共 3876 字,大约阅读时间需要 12 分钟。

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

 一、模板方法模式:

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

  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();            }}

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

  

转载于:https://www.cnblogs.com/AndroidJotting/p/4361153.html

你可能感兴趣的文章
谈谈进程、线程、协程
查看>>
Linux 修改密码
查看>>
正则表达式
查看>>
第四章例4-12(2)
查看>>
实验9 指针1
查看>>
java.util.Calendar简介
查看>>
快过高铁!构建云分布式应用还能这样操作?!
查看>>
Jacksonville Jaguars jersey cheap of precisely
查看>>
[WP7]修改 Pivot 控件的 PivotItem 标题字体大小
查看>>
CF2.D
查看>>
appium 使用环境安装配置记录
查看>>
读书笔记-你不知道的JS上-声明提升
查看>>
2017-11-16 高级软件测试技术小组工作记录
查看>>
关于SQL Server将一列的多行内容拼接成一行的问题讨论【转】
查看>>
修改Linux下MySQL编码
查看>>
使用Python + Apache POI提取Excel中的图片
查看>>
数据结构之 线性表 逆序简历链表
查看>>
Java中几个常用设计模式
查看>>
struts1和struts2的区别
查看>>
poj3107 Godfather(树的重心)
查看>>