Java中有很多種設(shè)計模式,其中策略模式和模板方法模式是比較常用的兩種。它們分別解決了不同的設(shè)計問題,下面我們分別來介紹一下。
1. 策略模式
策略模式是指定義一系列的算法,把它們一個個封裝起來,并且使它們可以相互替換。策略模式使得算法可以獨立于使用它的客戶端而變化。
下面是一個簡單的示例代碼:
// 策略接口 public interface Strategy { void execute(); } // 具體策略實現(xiàn)類 public class ConcreteStrategyA implements Strategy{ @Override public void execute() { System.out.println("這是策略A的實現(xiàn)方法"); } } public class ConcreteStrategyB implements Strategy{ @Override public void execute() { System.out.println("這是策略B的實現(xiàn)方法"); } } // 上下文類 public class Context { private Strategy strategy; public void setStrategy(Strategy strategy) { this.strategy = strategy; } public void executeStrategy() { if(strategy != null) { strategy.execute(); } } } // 客戶端代碼 public class Client { public static void main(String[] args) { Context context = new Context(); context.setStrategy(new ConcreteStrategyA()); context.executeStrategy(); context.setStrategy(new ConcreteStrategyB()); context.executeStrategy(); } }
上面的代碼中,定義了一個策略接口和兩個具體的策略實現(xiàn)類,上下文類中維護了一個策略對象并且提供了執(zhí)行策略的方法。使用策略模式的好處是可以方便地擴展新的策略實現(xiàn)類而不需要修改原有的代碼。
2. 模板方法模式
模板方法模式是指在一個抽象類中定義一個算法的骨架,將一些步驟延遲到子類中實現(xiàn)。模板方法模式使得子類可以不改變算法結(jié)構(gòu)的情況下重新定義算法的某些步驟。
下面是一個簡單的代碼示例:
// 抽象類 public abstract class AbstractClass { public final void templateMethod() { // 執(zhí)行算法骨架 specificMethod(); abstractMethod1(); abstractMethod2(); hookMethod(); } public void specificMethod() { System.out.println("抽象類中的具體方法被調(diào)用了..."); } public abstract void abstractMethod1(); public abstract void abstractMethod2(); public void hookMethod() {} } // 具體子類 public class ConcreteClassA extends AbstractClass { @Override public void abstractMethod1() { System.out.println("A類實現(xiàn)了抽象方法1"); } @Override public void abstractMethod2() { System.out.println("A類實現(xiàn)了抽象方法2"); } } public class ConcreteClassB extends AbstractClass { @Override public void abstractMethod1() { System.out.println("B類實現(xiàn)了抽象方法1"); } @Override public void abstractMethod2() { System.out.println("B類實現(xiàn)了抽象方法2"); } @Override public void hookMethod() { System.out.println("B類重寫了鉤子方法"); } } // 客戶端代碼 public class Client { public static void main(String[] args) { AbstractClass classA = new ConcreteClassA(); classA.templateMethod(); System.out.println("----------------------"); AbstractClass classB = new ConcreteClassB(); classB.templateMethod(); } }
上面的代碼中,抽象類中定義了一個模板方法,該方法定義了一個算法的骨架,具體的步驟在抽象方法中實現(xiàn),其中有一個可選的鉤子方法,可以在子類中進行重寫。具體子類只需要實現(xiàn)抽象方法即可。
使用模板方法模式的好處在于可以避免代碼的重復(fù),將算法實現(xiàn)和框架分離開來,提高代碼的可維護性。