上一篇為大家介紹了一下關于模板方法模式的實現,后來我發現里面有一點小瑕疵,本篇重新為大家介紹一下關于模板方法模式的實現。另外為大家分享一下關于策略模式的實現。
一、模板方法模式:
對于上一篇為大家介紹的實現方法,大家是否有這樣的疑問,如果哪位用戶說,我要一杯清茶,不要加檸檬,這時我們飲料機該如何操作呢?為了解決這個問題,我們需要引入一個鉤子方法,用來達到我們是否加檸檬的操作。
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. 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(); }} 好了,到這里我們的策略模式就介紹完畢,下一篇:設計模式中的適配器、工廠、代理模式
新聞熱點
疑難解答