模板模式 赵四把做饭的步骤交给了张三,具体实现由张三实现。
类图 父类是一个抽象类,如下图,template负责组合step1,step2……,也就是负责组合具体步骤,具体子类实现step1,step2……(行为由父类控制,实现由子类实现)
举个例子 步骤 1
创建一个抽象类,它的模板方法被设置为 final。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public abstract class Game { abstract void initialize () ; abstract void startPlay () ; abstract void endPlay () ; public final void play () { initialize(); startPlay(); endPlay(); } }
步骤 2
创建扩展了上述类的实体类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class Cricket extends Game { @Override void endPlay () { System.out.println("Cricket Game Finished!" ); } @Override void initialize () { System.out.println("Cricket Game Initialized! Start playing." ); } @Override void startPlay () { System.out.println("Cricket Game Started. Enjoy the game!" ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class Football extends Game { @Override void endPlay () { System.out.println("Football Game Finished!" ); } @Override void initialize () { System.out.println("Football Game Initialized! Start playing." ); } @Override void startPlay () { System.out.println("Football Game Started. Enjoy the game!" ); } }
步骤 3
使用Game的模板方法 play() 来演示游戏的定义方式。
1 2 3 4 5 6 7 8 9 public class TemplatePatternDemo { public static void main (String[] args) { Game game = new Cricket (); game.play(); System.out.println(); game = new Football (); game.play(); } }
步骤 4
执行程序,输出结果:
1 2 3 4 5 6 7 Cricket Game Initialized! Start playing. Cricket Game Started. Enjoy the game! Cricket Game Finished! Football Game Initialized! Start playing. Football Game Started. Enjoy the game! Football Game Finished!
抽奖项目中的运用 责任链抽奖和规则树过滤交给子类去实现。
责任链模式 类图
抽象处理类:1.设置下一个处理者;2.抽象处理请求
实现类:继承抽象处理类并复写处理请求方法
举个例子 步骤 1
创建抽象的记录器类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 public abstract class AbstractLogger { public static int INFO = 1 ; public static int DEBUG = 2 ; public static int ERROR = 3 ; protected int level; protected AbstractLogger nextLogger; public void setNextLogger (AbstractLogger nextLogger) { this .nextLogger = nextLogger; } public void logMessage (int level, String message) { if (this .level <= level){ write(message); } if (nextLogger !=null ){ nextLogger.logMessage(level, message); } } abstract protected void write (String message) ; }
步骤 2
创建扩展了该记录器类的实体类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 public class ConsoleLogger extends AbstractLogger { public ConsoleLogger (int level) { this .level = level; } @Override protected void write (String message) { System.out.println("Standard Console::Logger: " + message); } }public class ErrorLogger extends AbstractLogger { public ErrorLogger (int level) { this .level = level; } @Override protected void write (String message) { System.out.println("Error Console::Logger: " + message); } }public class FileLogger extends AbstractLogger { public FileLogger (int level) { this .level = level; } @Override protected void write (String message) { System.out.println("File::Logger: " + message); } }
步骤 3
创建不同类型的记录器。赋予它们不同的错误级别,并在每个记录器中设置下一个记录器。每个记录器中的下一个记录器代表的是链的一部分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 public class ChainPatternDemo { private static AbstractLogger getChainOfLoggers () { AbstractLogger errorLogger = new ErrorLogger (AbstractLogger.ERROR); AbstractLogger fileLogger = new FileLogger (AbstractLogger.DEBUG); AbstractLogger consoleLogger = new ConsoleLogger (AbstractLogger.INFO); errorLogger.setNextLogger(fileLogger); fileLogger.setNextLogger(consoleLogger); return errorLogger; } public static void main (String[] args) { AbstractLogger loggerChain = getChainOfLoggers(); loggerChain.logMessage(AbstractLogger.INFO, "This is an information." ); loggerChain.logMessage(AbstractLogger.DEBUG, "This is a debug level information." ); loggerChain.logMessage(AbstractLogger.ERROR, "This is an error information." ); } }
步骤 4
执行程序,输出结果:
1 2 3 4 5 6 Standard Console::Logger: This is an information. File::Logger: This is a debug level information. Standard Console::Logger: This is a debug level information. Error Console::Logger: This is an error information. File::Logger: This is an error information. Standard Console::Logger: This is an error information.
抽奖项目 使用责任链模式完成:黑名单——权重——默认抽奖的流程。
组合模式 是什么 又叫作整体-部分(Part-Whole)模式,它将对象组合成树状的层次结构,用来表示整体-部分的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构型模式。
由上图可以看出,
组合模式在树型结构中,模糊了简单元素(叶子节点)和复杂元素(树枝节点)的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
类图 component:公共抽象类,定义共同的行为;
left和composit相当于二叉树中的叶子节点和非叶子节点,类似于文件夹和文件。
案例 文件夹:文件夹可以有子文件夹和文件。遍历某个文件夹下所有文件时,就需要用到组合模式
抽奖项目中
抽奖后的判断采用类似于组合模式的方式,构建规则树。