意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决:将这些算法封装成一个一个的类,任意地替换。
package com.lzhsite.technology.designPattern.strategy.LogTemplateDemo; public class ClientForLogTemplateDemo { public static void main(String[] args) { LogContext logContext = new LogContext(); logContext.log("记录日志"); logContext.log("再次记录日志"); } }
package com.lzhsite.technology.designPattern.strategy.LogTemplateDemo; public class DBLog extends LogStrategyTemplate { protected void doLog(String logMessage) { if (logMessage != null && logMessage.trim().length() > 5) { int a = 5 / 0; } System.out.println("现在把 '" + logMessage + "' 记录到数据库中"); } }
package com.lzhsite.technology.designPattern.strategy.LogTemplateDemo; public class FileLog extends LogStrategyTemplate { protected void doLog(String logMessage) { System.out.println("现在把 '" + logMessage + "' 记录到文件中"); } }
package com.lzhsite.technology.designPattern.strategy.LogTemplateDemo; public class LogContext { public void log(String logMessage) { LogStrategy strategy = new DBLog(); try { //这里进行了策略的选择吧try-catch变相当if else用了 strategy.log(logMessage); } catch (Exception exception) { strategy = new FileLog(); strategy.log(logMessage); } } }
package com.lzhsite.technology.designPattern.strategy.LogTemplateDemo; public interface LogStrategy { public void log(String logMessage); }
package com.lzhsite.technology.designPattern.strategy.LogTemplateDemo; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; public abstract class LogStrategyTemplate implements LogStrategy { public final void log(String logMessage) { DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS"); logMessage = dateFormat.format(new Date()) + " 内容是:" + logMessage; doLog(logMessage); } protected abstract void doLog(String logMessage); }