public interface IEmployee { void doing(String task); } public class EmployeeA implements IEmployee { @Override public void doing(String task) { System.out.println("我是开发人员,开始做" + task + "工作"); } } public class EmployeeB implements IEmployee { @Override public void doing(String task) { System.out.println("我是设计人员,开始做" + task + "工作"); } } public class Leader implements IEmployee { private IEmployee employeeA = new EmployeeA(); private IEmployee employeeB = new EmployeeB(); // 项目经理就是拆分任务给不同的员工来完成 @Override public void doing(String task) { String[] taskSplit = task.split(","); employeeA.doing(taskSplit[0]); employeeA.doing(taskSplit[1]); } }
老板下达任务给项目经理。
public class Boss { private Leader leader = new Leader(); public void command(String task){ leader.doing(task); } } public class Test { public static void main(String[] args) { Boss boss = new Boss(); boss.command("开发,设计"); } }
public abstract class Worker { // 都是先进公司,然后工作,最后离开公司 public final void doing() { enterCompany(); work(); exitCompany(); } // 工作任务是不同的,让子类去实现 public abstract void work(); public void enterCompany() { System.out.println("进入公司"); } // 离开公司 public void exitCompany() { System.out.println("离开公司"); } } public class HRWorker extends Worker{ @Override public void work() { System.out.println("看简历"); } } public class ITWorker extends Worker { @Override public void work() { System.out.println("写代码"); } } public class Test { public static void main(String[] args) { Worker itWorker = new ITWorker(); itWorker.doing(); Worker hrWorker = new HRWorker(); hrWorker.doing(); } }
运行结果:
进入公司 写代码 离开公司 进入公司 看简历 离开公司
模板方法在 Spring 中的应用
RestTemplate JDBCTemplate
策略模式(Strategy Pattern)
将不同算法封装成一个类,每个算法完成的是同类型的问题。
策略模式实现购买商品使用不同的支付方式
策略模式在JDK中的应用
比较器是一个典型的策略模式,定义一个比较器接口,对象要排序可以实现自己的比较器实现类。
public interface Comparator { int compare(T o1, T o2); }
@Data public class Member { private String loginName; private String loginPass; private String roleName; public Member(String loginName, String loginPass) { this.loginName = loginName; this.loginPass = loginPass; } }
传统编码,在同一个方法里一个一个进行判断。
public class MemberService { public void login(String loginName, String loginPass) { if (StringUtils.isEmpty(loginName) || StringUtils.isEmpty(loginPass)) { System.out.println("用户名或密码不为空,校验失败"); return; } System.out.println("用户名、密码校验成功"); if (!"James".equals(loginName)) { System.out.println("用户不存在"); return; } Member member = new Member(); member.setRoleName("管理员"); if (!"管理员".equals(member.getRoleName())) { System.out.println("您不是管理员,没有权限"); return; } System.out.println("登录成功"); } public static void main(String[] args) { MemberService memberService = new MemberService(); memberService.login("Ja1mes", "null"); } }
使用责任链和建造者结合模式,将每个步骤处理连起来。 抽象出处理类。
public abstract class Handler { // 指向下一个处理类 protected Handler chain; // 设置下一个处理类 public void next(Handler handler) { this.chain = handler; } // 具体处理逻辑 public abstract void doHandler(Member member); // 构建一条链式处理逻辑 public static class Builder { // 第一个处理类 private Handler head; // 最后一个处理类 private Handler tail; // 从头开始添加处理类 public Builder addHandler(Handler handler) { if (this.head == null) { // 只有一个处理类,所以不需要设置下一个处理类 this.head = this.tail = handler; return this; } // 设置下一个处理类 this.tail.next(handler); // 尾部设置为下一个处理类的引用 this.tail = handler; return this; } // 返回的是第一个处理类 public Handler builder() { return this.head; } } }
具体实现三个处理类,来进行分别校验
public class ValidateHandler extends Handler { @Override public void doHandler(Member member) { if (StringUtils.isEmpty(member.getLoginName()) || StringUtils.isEmpty(member.getLoginPass())) { System.out.println("用户名或密码不为空,校验失败"); return; } System.out.println("用户名、密码校验成功"); chain.doHandler(member); } } public class LoginHandler extends Handler { @Override public void doHandler(Member member) { if (!"James".equals(member.getLoginName())){ System.out.println("用户名不存在"); return; } System.out.println("登录成功"); member.setRoleName("管理员"); chain.doHandler(member); } } public class AuthHandler extends Handler { @Override public void doHandler(Member member) { if (!"管理员".equals(member.getRoleName())) { System.out.println("您不是管理员,没有权限"); return; } System.out.println("您是管理员,允许操作"); } }
public class MemberService { public void login(String loginName, String loginPass) { // 构建一条链式处理 Handler.Builder builder = new Handler.Builder() .addHandler(new ValidateHandler()) .addHandler(new LoginHandler()) .addHandler(new AuthHandler()); // 从第一个处理类执行到最后一个处理类 builder.builder().doHandler(new Member("James11", "1234")); } public static void main(String[] args) { MemberService memberService = new MemberService(); memberService.login("Ja1mes", "1234"); } }