模板模式
某些事情的大体流程是固定的,只是个别地方,存在一些不确定数据的动态变化,此时可以使用模板模式。
实现方式
抽取固定步骤,生成抽象的模板类。
分析代码,将发生变化的部分,抽取独立成一个方法。
使用 final 修饰模板方法,防止模板方法被重写。
时间模板类,模拟随机获取1~1.5s的时间差
abstract class TimeDemo {
//让实现类,去确定的开始,结束时间
public abstract long setStartTime();
public abstract long setEndTime();
//获取时间差
final public long getDifferTime() {
long startTime = setStartTime();
// 随机睡眠 1~1.5s,好获取数据
Random random = new Random();
int s = random.nextInt(501) + 1000;
try {
Thread.sleep(s);
} catch (InterruptedException e) {
e.printStackTrace();
}
long endTime = setEndTime();
long resTime = endTime - startTime;
System.out.println("睡眠了:" + resTime / 1000.0 + "s");
return resTime;
}
}
实现类
public class Run extends TimeDemo {
public static void main(String[] args) {
new Run().getTime();
}
@Override
public long setStartTime() {
return System.currentTimeMillis();
}
@Override
public long setEndTime() {
return System.currentTimeMillis();
}
public void getTime() {
getDifferTime();
}
}
装饰者模式
通过在一个类的内部,维护另一个类的引用,来增强这个类的功能,实际原理是多态的应用。
//定义公共的接口规范
interface IWork {
void work();
}
//将要被装饰增强的类
class Overseer implements IWork {
@Override
public void work() {
System.out.println("工头制作零件主体");
}
}
//装饰类1,增强被装饰类功能
class EmpOne implements IWork {
private IWork work;
public EmpOne(IWork work) {
this.work = work;
}
@Override
public void work() {
work.work();
System.out.println("工人给零件主体添加组件_1");
}
}
//装饰类2
class EmpTwo implements IWork {
private IWork work;
public EmpTwo(IWork work) {
this.work = work;
}
@Override
public void work() {
work.work();
System.out.println("给零件主体增加组件_2");
}
}
public static void main(String[] args) {
Overseer overseer = new Overseer();
EmpOne empOne = new EmpOne(overseer);
EmpTwo empTwo = new EmpTwo(empOne);
empTwo.work();
/*
* 输出结果
*
* 制作零件主体
* 给零件主体添加组件_1
* 给零件主体增加组件_2
*/
}