抽象模板设计模式
- 由抽象出来的父类来编写代码中不变的部分。
- 将变化的部分交给子类去完成。通过抽象方法让子类必须去完成
- 抽象模板方法是遵循了里式替换设计原则,是对继承的一种优秀的使用经验
- 例子:把大象装冰箱,分三步
- 这是抽象模板方法设计模式中抽象出来的父类的描述方式
(第一步:把冰箱门打开、第二步:把大象装进去、第三步:把冰箱门关上) - 具体的第二步需要先把大象XXX,然后xxx,再然后xxx
- 这是抽象模板方法设计模式中抽象出来的父类的描述方式
代码:
模板设计模式
- 抽取一个抽象模板类,同时定义模板方法 对于模板方法的实现,在子类中去实现
public abstract class GetTimeTemplate {
// 固定流程方法
public long getTime() {
// 获取起始时间
long t1 = System.currentTimeMillis();
// 模板方法
code();
// 获取结束时间
long t2 = System.currentTimeMillis();
return t2 - t1;
}
// 钩子方法
public abstract void code();
}
子类:
public class ForDemo extends GetTimeTemplate{
@Override
public void code() {
//输出for循环
for (int i = 0; i < 10000; i++) {
System.out.println(i);
}
}
}
测试类:
public class TemplateTest {
public static void main(String[] args) {
/*GetTime time = new GetTime();
System.out.println("耗时 "+time.getTime()+" 毫秒");*/
GetTimeTemplate time = new ForDemo();
System.out.println("耗时 "+time.getTime()+" 毫秒");
GetTimeTemplate time2 = new CopyFileDemo();
System.out.println("耗时 "+time2.getTime()+" 毫秒");
}
}
策略模式
- 将不同的算法分别封装到不同的类当中。便于扩展和维护
- 策略模式就是让调用这些策略的使用者来讲,根本感知不到策略代码发生了扩展。
- 一个类的行为或其算法可以在运行时更改
- 策略模式有两种常用的使用方式
- 一种就是你给我什么策略,我干什么事情
示例1:
- 我们将创建一个定义活动的 Strategy 接口和实现了 Strategy 接口的实体策略类。Context 是一个使用了某种策略的类。
- StrategyPatternDemo,我们的演示类使用 Context 和策略对象来演示 Context 在它所配置或使用的策略改变时的行为变化。
步骤1:
public interface Strategy {
public int doOperation(int num1, int num2);
}
步骤2:
public class OperationAdd implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
public class OperationSubstract implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
public class OperationMultiply implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
步骤3:
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2){
return strategy.doOperation(num1, num2);
}
}
步骤 4:
public class StrategyPatternDemo {
public static void main(String[] args) {
Context context = new Context(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationSubstract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
}
步骤 5:
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50
- 还有一种就是我自己拥有很多策略,我会根据具体的情况去选择具体的策略
public interface TravelStrategy {
//出行方式
void travelWay();
boolean isOK(int type);
}
public class PersonContext {
// 拥有一个出行策略引用
private List<TravelStrategy> strategylist;
public PersonContext() {
this.strategylist = new ArrayList<>();
strategylist.add(new AirPlanelStrategy());
strategylist.add(new TrainStrategy());
strategylist.add(new BicycleStrategy());
}
public void travel(int juli) {
// 根据具体策略类,执行对应的出行策略
for (TravelStrategy travelStrategy : strategylist) {
if (travelStrategy.isOK(juli)) {
travelStrategy.travelWay();
break;
}
}
}
举个栗子:锦囊妙计(对外来说,长得都差不多)
- 策略模式其实很多时候都是可以优化if语句的。
举个栗子 :
- 将计算行为抽象出来,作为策略接口(Strategy),而这个接口下面有加法计算行为、有乘法计算行为。
- 将Mybatis中3.0版本中的NodeHandler的部分使用策略模式去改造。