Java的设计模式之责任链模式、MVC模式、DAO模式

⑦ 行为型模式中的责任链模式
  • 责任链模式(Chain of Responsibility Pattern): 将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象处理。
  • 个人感觉:
    ① 与JVM中的双亲委托模型很相似,不过双亲委托模型是自己不管是否能不能干都丢给父亲去干,父亲不存在了就自己处理。
    ② 该模式适合办公系统中的各种流程审批,比如请假、报销、项目立案等。
  • 场景:
  1. 公司里面,报销个单据需要经过流程:
    • 申请人填单申请,申请给经理
    • 小于1000,经理审查。
    • 超过1000,交给总经理审批。
    • 总经理审批通过
  2. 公司里面,请假条的审批过程:
    • 如果请假天数小于3天,主任审批
    • 如果请假天数大于等于3天,小于10天,经理审批
    • 如果大于等于10天,小于30天,总经理审批
    • 如果大于等于30天,提示拒绝

以请假审批流程为例:

  1. 创建请假请求,包含请假人姓名、请假天数、请假原因:
public class LeaveReqesut {
    private String name;
    private int day;
    private String reason;
    public LeaveReqesut(String name,int day,String reason){
        this.name=name;
        this.day=day;
        this.reason=reason;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getDay() {
        return day;
    }
    public void setDay(int day) {
        this.day = day;
    }
    public String getReason() {
        return reason;
    }
    public void setReason(String reason) {
        this.reason = reason;
    }
}
  1. 创建抽象领导类,里面有领导姓名,责任链上的后继对象,均为protected,因为后面的子类还需要直接使用他。还有抽象方法handleRequest,用于处理请假请求,后面的子类都需要实现自己的请假请求。
public abstract class Leader {
    // 领导姓名
    protected String name;
    // 可以处理请假审批的下一个领导,责任链上的后继对象
    protected Leader nextLeader;
    public Leader(String name){
        this.name=name;
    }
    //设定责任链上的后继对象
    public void setNextLeader(Leader nextLeader){
        this.nextLeader=nextLeader;
    }
    /**
     * 处理请求的核心的业务方法
     * @param request
     */
    public abstract void handleRequest(LeaveReqesut request);
}
  1. 创建继承Leader抽象类,创建主任、经理、老板类。其中主任、经理都需要在超过自己审核范围的时候,查询责任链上的后继对象,请求上级领导处理该请假事宜。
public class Director extends Leader {
    public Director(String name) {
        super(name);
    }
    @Override
    public void handleRequest(LeaveReqesut request) {
        if (request.getDay() > 0 && request.getDay() <= 3) {
            System.out.println("我是主任" + this.name + "," + request.getName()
                    + "请假" + request.getDay() + "天,我处理了");
        } else {
            if (nextLeader != null) {// 主任有上级领导,交给上级领导审批
                System.out.println("我是主任" + this.name + "," + request.getName()
                        + "请假" + request.getDay() + "天,我不能处理。请经理处理...");
                this.nextLeader.handleRequest(request);
            }
        }
    }
}
public class Manager extends Leader{
    public Manager(String name){
        super(name);
    }
    @Override
    public void handleRequest(LeaveReqesut request) {
        if (request.getDay()<=10){
            System.out.println("我是经理" + this.name + "," + request.getName()
                    + "请假" + request.getDay() + "天,我处理了");
        }else{
            if (this.nextLeader!=null){
                System.out.println("我是经理" + this.name + "," + request.getName()
                        + "请假" + request.getDay() + "天,我不能处理。请老板处理...");
                this.nextLeader.handleRequest(request);
            }
        }
    }
}
public class Boss extends Leader {
    public Boss(String name){
        super(name);
    }
    @Override
    public void handleRequest(LeaveReqesut request) {
        if (request.getDay()<=30){
            System.out.println("我是老板" + this.name + "," + request.getName()
                    + "请假" + request.getDay() + "天,我处理了");
        }else {// 超过30天直接离职
                System.out.println("我是老板" + this.name + "," + request.getName()
                        + "请假" + request.getDay() + "天。超过规定最大天数,请离职");
        }
    }
}
  1. 客户端调用测试:
public class ResponseChain {
    public static void main(String args[]){
        // 创建部门领导
        Director director=new Director("李主任");
        Manager manager=new Manager("王经理");
        Boss boss=new Boss("胡老板");
        //组织责任链对象的关系
        director.setNextLeader(manager);
        manager.setNextLeader(boss);
        LeaveReqesut reqesut=new LeaveReqesut("张三",20,"母亲生病");
        director.handleRequest(reqesut);// 率先交给主任审批
    }
}
  1. 运行结果如下:
    在这里插入图片描述
  • 总结:
    ① 要在责任链的父类中创建后继对象属性,并且提供方法设置后继对象
    ② 还需要创建抽象方法,用于子类实现自己的处理流程,并在不能处理问题时,调用责任链上的后继对象处理该问题。
    ③ 创建好责任链上个对象后,需要为该对象设置后继对象。
4. J2EE中的设计模式
  • J2EE模式有以下模式:MVC 模式(MVC Pattern)、业务代表模式(Business Delegate Pattern)、组合实体模式(Composite Entity Pattern)、数据访问对象模式(Data Access Object Pattern)、前端控制器模式(Front Controller Pattern)、拦截过滤器模式(Intercepting Filter Pattern)、服务定位器模式(Service Locator Pattern)、传输对象模式(Transfer Object Pattern)
① MVC模式
  • 参考资讯网站的设计与实现
  • M(model): 企业数据及业务规则
  • V(view): 用户看到并与之交互的界面
  • C(controller): 接受用户的输入并调用模型和视图去完成用户的需求
② DAO模式
  • 数据访问对象模式(Data Access Object Pattern)或 DAO 模式用于把低级的数据访问 API 或操作从高级的业务服务中分离出来。
  • 以下是数据访问对象模式的参与者:
    模型对象/数值对象(Model Object/Value Object) - 该对象是简单的 POJO,包含了 get/set 方法来存储通过使用 DAO 类检索到的数据。即经常所说的实体或者bean
    数据访问对象接口(Data Access Object Interface) - 该接口定义了在一个模型对象上要执行的标准操作。即所定义的dao接口
    数据访问对象实体类(Data Access Object concrete class) - 该类实现了上述的接口。该类负责从数据源获取数据,数据源可以是数据库,也可以是 xml,或者是其他的存储机制。即实现dao接口的类daoIml,与数据库进行数据交互
③ 拦截过滤器模式
  • 拦截过滤器模式(Intercepting Filter Pattern) 用于对应用程序的请求或响应做一些预处理/后处理
  • spring中的拦截器:请求之后、controller之前,controller之后、渲染之前。详情参考 资讯网站的设计与实现
5. 面试中常问的设计模式问题

1. 什么是设计模式?你是否在你的代码里面使用过任何设计模式?
答: 设计模式是软件开发人员面临一般问题的解决方案,这种解决方案是程序设计经验的总结,在实际过程中被反复使用。
java的23种设计模式使用的比较少,最多的是迭代器模式(HashMap的遍历)、桥接模式中的JDBC
J2EE的设计模式使用的多:MVC模式(一般的java web开发)、DAO模式(实体、dao、daoIml)、拦截过滤器模式(spring中的拦截器)。

2. 在标准的JDK库中使用的一些设计模式?

  • 单例模式: java.awt.Desktop#getDesktop()
  • 桥接模式: AWT(用于创建用户界面和绘制图形图像的所有分类,提供了抽象层映射于实际的操作系统)、JDBC。
  • 迭代器模式: 提供一种一致的方法来顺序遍历一个容器中的所有元素。java.util.Iteratorjava.util.Enumeration
Map<String,String> map=new HashMap<String,String>();
for(String key:map.keySet())
{
	System.out.println("Key: "+key+" Value: "+map.get(key));
}
for(Map.Entry<String, String> entry: map.entrySet())
{
 	System.out.println("Key: "+ entry.getKey()+ " Value: "+entry.getValue());
}
for(String v:map.values())
{
 	System.out.println("The value is "+v);
}
Iterator map1it=map.entrySet().iterator();
while(map1it.hasNext())
{
 	Map.Entry<String, String> entry=(Entry<String, String>) map1it.next();
 	System.out.println("Key: "+entry.getKey()+" Value: "+entry.getValue());
}
  • 责任链模式: Java中的java.util.logging.Logger#log()javax.servlet.Filter#doFilter()

3. Java中什么是单例设计模式?用Java写出线程安全的单例。

  • 答: 单例模式是指一个类只能创建一个对象,而且由自己创建并对外提供一个全局访问的接口(静态方法)。
    线程安全的单例,懒汉模式getInstance方法加上synchronized关键字

4. 什么是MVC设计模式?举一个MVC设计模式的例子?

  • 答: MVC设计模式经常用于java web开发中,M是model的缩写,表示数据和处理数据的业务规则;V是view 的缩写,是用户看到并与之交互的界面;C是controller的缩写,它会接受用户通过view的输入并调用相应的model处理用户输入,然后向view返回处理结果,由view负责将结果展示给用户。
    以用户注册为例,用户在界面上输入用户名、密码,发送注册请求给控制器,由控制器调用相应的注册处理逻辑,将合法的用户名、密码存存入数据库,并将成功注册的消息返回并在界面上进行显示。

5. 什么是责任链模式(Chain of Responsibility)?

  • 答: 该模式将可以处理相同请求的对象构成链,将请求从链的底层开始向上传递,直到某个对象能够处理该请求便停止传递。适合用于办公系统中的各种流程审批。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值