设计模式实验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);
    }
}
复制代码

 

posted @   一个小虎牙  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示