模版方法模式结构:由一个抽象类和一个(或一组)实现类通过继承结构组成,抽象类中的方法分为三种:
- 抽象方法:父类只声明但不实现,由它的子类去实现。
- 模版方法:父类声明并实现。模版方法调用抽象方法来完成主要的逻辑功能,并且模版方法大多会定义为final类型,不能被子类重写。
- 钩子方法:父类声明并实现。但子类可以去扩展,子类可以通过扩展钩子方法来影响模版方法的逻辑。
模版方法模式优点:容易扩展,便于维护,比较灵活
策略模式结构:
-
封装类:也叫上下文,对策略进行二次封装,目的是避免高层模块对策略的直接调用。
-
抽象策略:通常情况下为一个接口,当各个实现类中存在着重复的逻辑时,则使用抽象类来封装这部分公共的代码,此时,策略模式看上去更像是模版方法模式。
-
具体策略:具体策略角色通常由一组封装了算法的类来担任,这些类之间可以根据需要自由替换。
interface IStrategy { public void doSomething(); } class ConcreteStrategy1 implements IStrategy { public void doSomething() { System.out.println("具体策略1"); } } class ConcreteStrategy2 implements IStrategy { public void doSomething() { System.out.println("具体策略2"); } } class Context { private IStrategy strategy; public Context(IStrategy strategy){ this.strategy = strategy; } public void execute(){ strategy.doSomething(); } } public class Client { public static void main(String[] args){ Context context; System.out.println("-----执行策略1-----"); context = new Context(new ConcreteStrategy1()); context.execute(); System.out.println("-----执行策略2-----"); context = new Context(new ConcreteStrategy2()); context.execute(); } }