[19/04/29-星期一] GOF23_行为型模式(责任链模式、迭代器模式)
一、行为模式

二、责任链模式(chainOfResponsibility)







【一个请求类】
/*** 请假类
* 封装请假的基本信息
*/
package cn.sxt.chainOfResponsibility; public class LeaveRequest {
private String empName;
private int leaveDays;
private String reason; public LeaveRequest(String empName, int leaveDays, String reason) {
super();
this.empName = empName;
this.leaveDays = leaveDays;
this.reason = reason;
} public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public int getLeaveDays() {
return leaveDays;
}
public void setLeaveDays(int leaveDays) {
this.leaveDays = leaveDays;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
} }
【领导类】
/***
* 抽象类 "领导"类
*/
package cn.sxt.chainOfResponsibility; public abstract class Leader {
protected String name;//protected子类可以使用的属性
protected Leader nextLeader;//责任链上的下一个领导 public Leader(String name) {
super();
this.name = name;
} //下一个(上一级)领导的名字
public void setNextLeader(Leader nextLeader) {
this.nextLeader = nextLeader;
}
//处理请求的核心方法 抽象方法
public abstract void handleRequest(LeaveRequest request); }
【各级领导】
/** "主任" 类
*
*/
package cn.sxt.chainOfResponsibility; public class Director extends Leader { public Director(String name) {
super(name);
} @Override
public void handleRequest(LeaveRequest request) {
if (request.getLeaveDays()<=3) {
System.out.println("员工:"+request.getEmpName()+",请假天数:"+request.getLeaveDays()+",事由:"
+request.getReason());
System.out.println("意见:主任_"+this.name+",审批通过!"); }else {//大于3天交给下家-经理处理
if (this.nextLeader!=null) {
this.nextLeader.handleRequest(request);
}
}
} } /** "经理" 类
*
*/
package cn.sxt.chainOfResponsibility; public class Manager extends Leader { public Manager(String name) {
super(name);
} @Override
public void handleRequest(LeaveRequest request) {
if (request.getLeaveDays()<=10) {
System.out.println("员工:"+request.getEmpName()+",请假天数:"+request.getLeaveDays()+",事由:"
+request.getReason());
System.out.println("意见:经理_"+this.name+",审批通过!"); }else {//大于10天交给总经理处理
if (this.nextLeader!=null) {
this.nextLeader.handleRequest(request);
}
}
} } /** 添加"副总经理" 类,不需要修改已有的代码
*
*/
package cn.sxt.chainOfResponsibility; public class ViceGeneraManager extends Leader { public ViceGeneraManager(String name) {
super(name);
} @Override
public void handleRequest(LeaveRequest request) {
if (request.getLeaveDays()<=20) {
System.out.println("员工:"+request.getEmpName()+",请假天数:"+request.getLeaveDays()+",事由:"
+request.getReason());
System.out.println("意见:副总经理_"+this.name+",审批通过!"); }else {//副总经理找经理
if (this.nextLeader!=null) {
this.nextLeader.handleRequest(request);
}
}
} } /** "总经理" 类
*
*/
package cn.sxt.chainOfResponsibility; public class GeneraManager extends Leader { public GeneraManager(String name) {
super(name);
} @Override
public void handleRequest(LeaveRequest request) {
if (request.getLeaveDays()<=30) {
System.out.println("员工:"+request.getEmpName()+",请假天数:"+request.getLeaveDays()+",事由:"
+request.getReason());
System.out.println("意见:总经理_"+this.name+",审批通过!"); }else {//总经理没有下一家
System.out.println("莫非"+request.getEmpName()+"想辞职,让他交离职申请吧!"); }
} }
【客户】
/**
*
*/
package cn.sxt.chainOfResponsibility; public class Client {
public static void main(String[] args) {
Leader director=new Director("张主任");
Leader manager=new Manager("王经理");
Leader viceLeader=new ViceGeneraManager("赵副总");//增加副总审批
Leader genLeader=new GeneraManager("李总"); //组织责任链,即领导之间的关系
director.setNextLeader(manager);
manager.setNextLeader(viceLeader);
viceLeader.setNextLeader(genLeader); //请假操作
LeaveRequest req1=new LeaveRequest("Tom", 15, "去抓老鼠Jerry");
director.handleRequest(req1); LeaveRequest req2=new LeaveRequest("Dog", 31, "去揍Tom猫");
director.handleRequest(req2); }
}
三、迭代器模式(iterator)



【自定义接口】
/**
* 自定义迭代器接口
*/
package cn.sxt.iterator; public interface Myiterator {
void first();//将游标指向第一个元素
void next();//将游标指向下一个元素
boolean hasNext();//判断是否存在下一个元素 boolean isFirst();
boolean isLast(); Object getCurrentObj();//获取当前游标指向的对象 }
/**
* 自定义聚合类
*/
package cn.sxt.iterator; import java.util.ArrayList;
import java.util.List; public class ConcreteMyAggregate {
private List<Object> list=new ArrayList<Object>(); public void addObj(Object obj) {//增
this.list.add(obj);
} public void remove(Object obj) {//删除
this.list.remove(obj);
} public List<Object> getList() {
return list;
} public void setList(List<Object> list) {
this.list = list;
} public Myiterator creaMyiterator() {//获得一个迭代器
return new ConcreteIterator(); } //使用内部类定义迭代器 可以使用外部类的属性
private class ConcreteIterator implements Myiterator{
private int cursor;//定义游标,用于遍历时的位置,如果要倒置遍历,则private int cursor=list.size()-1,下边的++变-- @Override
public void first() {
cursor=0;
} @Override
public Object getCurrentObj() {//当前游标指向的对象
return list.get(cursor);
} @Override
public boolean hasNext() {
if (cursor<list.size()) {
return true;
}
return false;
} @Override
public boolean isFirst() {
return cursor==0?true:false;
} @Override
public boolean isLast() {
return cursor==(list.size()-1)?true:false;
}
@Override
public void next() {
if (cursor<list.size()) {
cursor++;
}
} }
}
【测试】
/**
*
*/
package cn.sxt.iterator; public class Client {
public static void main(String[] args) {
ConcreteMyAggregate cma=new ConcreteMyAggregate();
cma.addObj("我");
cma.addObj("爱");
cma.addObj("你"); Myiterator iter=cma.creaMyiterator();
while (iter.hasNext()) {
System.out.println(iter.getCurrentObj());
iter.next();
}
} }
[19/04/29-星期一] GOF23_行为型模式(责任链模式、迭代器模式)的更多相关文章
- 【设计模式】行为型05责任链模式(Chain of responsibility Pattern)
学习地址:http://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html demo采用了DEBUG级别举例子,理解起 ...
- 《Android源码设计模式》--状态模式--责任链模式--解释器模式--命令模式--观察者模式--备忘录模式--迭代器模式
[状态模式] No1: Wifi设置界面是一个叫做WifiSetting的Fragment实现的 No2: 在不同的状态下对于扫描Wifi这个请求的处理是完全不一样的.在初始状态下扫描请求被直接忽略, ...
- [19/04/28-星期日] GOF23_结构型模式(享元模式)
一.享元模式(FlyWeight,轻量级) [共享类与非共享类] /*** *FlyweightFactory享元工厂类: 创建并管理享元对象,享元池一般设计成键值对 */ package cn.sx ...
- 《精通Python设计模式》学习行为型之责任链模式
感觉是全新的学习了. 因为在以前的工作中,并没有有意识的去运用哪一种编程模式. 以后要注意的了. 这才是高手之路呀~ class Event: def __init__(self, name): se ...
- 【java设计模式】【行为模式Behavioral Pattern】迭代器模式Iterator Pattern
package com.tn.pattern; public class Client { public static void main(String[] args) { Object[] objs ...
- 设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)
设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型) 1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的 ...
- C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
一.引言 今天我们开始讲"行为型"设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看."迭代器模 ...
- C#设计模式之十五迭代器模式(Iterator Pattern)【行为型】
一.引言 今天我们开始讲“行为型”设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看.“迭代器模式”我第一次看到这个名称,我的理解 ...
- 设计模式(十五):Iterator迭代器模式 -- 行为型模式
1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...
随机推荐
- JavaScript中自定义函数以及文本框、radio、下拉框的值的获取,结合淘宝竞拍案例来理解。。。
淘宝竞拍案例: HTML部分代码: <form action="#" method="post"> <h2>欢迎进入淘宝竞拍</h ...
- 二、socket编写简单BIO的HTTP服务器
一.目标 诸如tomcat等web服务器中间件简化了我们web的开发成本,但有时候我们或许并不需要这么一个完备的服务器,只是希望做一个简单地处理或者做特殊用途的服务器. 本文将提供一个HTTP的服务器 ...
- Rabbit安装(windows)
安装rabbit后,启动服务,浏览器打开控制台找不到.查百度说是要装插件.翻了好几篇都是互相抄,没有能用到. 多翻了几篇终于找到一个靠谱的.可以打开控制台了.记录下: 首先要安装Erlang语言支持, ...
- Grpc helloworld demo的经验
GreeterGrpc.java这个文件是插件protoc-gen-grpc-java生成的 刚开始直接用类似如下的指令无法生成GreeterGrpc.java文件 protoc --java_ou ...
- 前端(十二):react-redux实现逻辑
一.context实现数据传递 在react中,props和state都可以设置数据.不同的是,props借助组件属性传递数据但不可以渲染组件,它相对来说是“静态的”:state可以监听事件来修改数据 ...
- CodeForces 598A(水)
还是要注意int和long long的范围,以及double型的问题 pow函数经常会报一个double型的错,参考这篇文章 http://blog.csdn.net/lawrencesgj/arti ...
- drupal7 为视图添加 过滤标准 内容类型
1.单击 FILTER CRITERIA 右边的“添加”按钮 2.在弹出的对话框中输入“类型”,单击搜索结果中的“内容:类型” 3.确定之后,选择需要的内容类型即可,例如添加“书评”内容类型的过滤 4 ...
- Python 批量修改文件夹名称
修改为: # -*- coding: utf-8 -*- import os, sys,re path=u"E:\\C#网络编程基础" dirs=os.listdir(path) ...
- Apose.Cell导出的Excel数字格式正确显示
使用Apose.Cell导出Excel时假如导出的如上图:边框左上角有绿色三角形区域,选中某个区域会出现感叹号询问是否要将文本转换为数字 那么在代码中使用PutValue方法时,后面的bool参数设为 ...
- Spring Data MongoDB 查询指定字段
DBObject dbObject = new BasicDBObject(); //dbObject.put("name", "zhangsan"); //查 ...