• JAVA设计模式《三》


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

     一、模板方法模式:

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

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

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

      

  • 相关阅读:
    DEDE更改版权信息
    apache 服务器端口被IIS服务器占用
    解析html与xhtml的神器——HTMLParser与SGMLParser
    正则匹配牛刀小试——一键抓取奇虎360新闻信息
    urllib2模块初体验———豆瓣读书页面下载小爬虫
    urllib模块和urllib2模块的区别
    cookielib和urllib2模块相结合模拟网站登录
    Python核心模块——urllib模块
    《java语言程序设计》初步学习——各种小Demo
    Python核心编程——Chapter15
  • 原文地址:https://www.cnblogs.com/AndroidJotting/p/4361153.html
Copyright © 2020-2023  润新知