设计模式实验14和15
实验14:代理模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解代理模式的动机,掌握该模式的结构;
2、能够利用代理模式解决实际问题。
[实验任务一]:婚介所
婚介所其实就是找对象的一个代理,请仿照我们的课堂例子“论坛权限控制代理”完成这个实际问题,其中如果年纪小于18周岁,婚介所会提示“对不起,不能早恋!”,并终止业务。
实验要求:
1. 提交类图;
源代码:
package test14; public interface MarriageAgency { void findMatch(String person); void setAge(int age); } package test14; // MarriageAgencyProxy.java public class MarriageAgencyProxy implements MarriageAgency { private RealMarriageAgency realMarriageAgency = new RealMarriageAgency(); private int age; @Override public void findMatch(String person) { // 在这里添加年龄检查逻辑 if (isUnderage(this.age)) { System.out.println("对不起"+person+",不能早恋!"); } else { realMarriageAgency.findMatch(person); } } @Override public void setAge(int age) { this.age=age; } private boolean isUnderage(int age) { // 假设这里是根据名字来判断年龄是否小于18岁的逻辑 // 实际应用中,可能需要更复杂的逻辑,比如从数据库获取年龄信息 // 这里只是一个简单的示例 return age<18; } }
package test14; public class RealMarriageAgency implements MarriageAgency { @Override public void findMatch(String person) { System.out.println("婚介所正在为 " + person + " 寻找合适的对象..."); } @Override public void setAge(int age) { } } package test14; public class Main { public static void main(String[] args) { MarriageAgency proxy = new MarriageAgencyProxy(); proxy.setAge(1); // 合法年龄的人可以进行婚介 proxy.findMatch("铭轩"); proxy.setAge(18); // 合法年龄的人可以进行婚介 proxy.findMatch("里斯"); } }
实验15:职责链模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解职责链模式的动机,掌握该模式的结构;
2、能够利用职责链模式解决实际问题。
[实验任务一]:财务审批
某物资管理系统中物资采购需要分级审批,主任可以审批1万元及以下的采购单,部门经理可以审批5万元及以下的采购单,副总经理可以审批10万元及以下的采购单,总经理可以审批20万元及以下的采购单,20万元以上的采购单需要开职工大会确定。现用职责链模式设计该系统。
实验要求:
1. 提交类图;
源代码:
package test15; public class PurchaseRequest { private int number; // 采购单号 private double amount; // 采购金额 public PurchaseRequest(int number, double amount) { this.number = number; this.amount = amount; } public int getNumber() { return number; } public double getAmount() { return amount; } }
package test15; public abstract class Approver { protected Approver successor; // 后继者 public void setSuccessor(Approver successor) { this.successor = successor; } public abstract void processRequest(PurchaseRequest request); } package test15; public class Director extends Approver { @Override public void processRequest(PurchaseRequest request) { if (request.getAmount() <= 10000) { System.out.println("主任审批采购单,单号:" + request.getNumber()); } else if (successor != null) { successor.processRequest(request); } } } package test15; public class Manager extends Approver { @Override public void processRequest(PurchaseRequest request) { if (request.getAmount() <= 50000) { System.out.println("部门经理审批采购单,单号:" + request.getNumber()); } else if (successor != null) { successor.processRequest(request); } } } package test15; public class VicePresident extends Approver { @Override public void processRequest(PurchaseRequest request) { if (request.getAmount() <= 100000) { System.out.println("副总经理审批采购单,单号:" + request.getNumber()); } else if (successor != null) { successor.processRequest(request); } } } package test15; public class President extends Approver { @Override public void processRequest(PurchaseRequest request) { if (request.getAmount() <= 200000) { System.out.println("总经理审批采购单,单号:" + request.getNumber()); } else if (successor != null) { successor.processRequest(request); } } } package test15; public class Congress extends Approver { @Override public void processRequest(PurchaseRequest request) { System.out.println("职工大会审批采购单,单号:" + request.getNumber()); } }
package test15; public class Main { public static void main(String[] args) { Approver director = new Director(); Approver manager = new Manager(); Approver vicePresident = new VicePresident(); Approver president = new President(); Approver congress = new Congress(); director.setSuccessor(manager); manager.setSuccessor(vicePresident); vicePresident.setSuccessor(president); president.setSuccessor(congress); // 模拟采购流程 PurchaseRequest request1 = new PurchaseRequest(1, 8000); PurchaseRequest request2 = new PurchaseRequest(2, 30000); PurchaseRequest request3 = new PurchaseRequest(3, 90000); PurchaseRequest request4 = new PurchaseRequest(4, 150000); PurchaseRequest request5 = new PurchaseRequest(5, 250000); director.processRequest(request1); director.processRequest(request2); director.processRequest(request3); director.processRequest(request4); director.processRequest(request5); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通