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

}

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

  

posted @ 2015-03-23 22:02  小破孩123  阅读(669)  评论(0编辑  收藏  举报