一、行为模式

二、责任链模式(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_行为型模式(责任链模式、迭代器模式)的更多相关文章

  1. 【设计模式】行为型05责任链模式(Chain of responsibility Pattern)

    学习地址:http://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html demo采用了DEBUG级别举例子,理解起 ...

  2. 《Android源码设计模式》--状态模式--责任链模式--解释器模式--命令模式--观察者模式--备忘录模式--迭代器模式

    [状态模式] No1: Wifi设置界面是一个叫做WifiSetting的Fragment实现的 No2: 在不同的状态下对于扫描Wifi这个请求的处理是完全不一样的.在初始状态下扫描请求被直接忽略, ...

  3. [19/04/28-星期日] GOF23_结构型模式(享元模式)

    一.享元模式(FlyWeight,轻量级) [共享类与非共享类] /*** *FlyweightFactory享元工厂类: 创建并管理享元对象,享元池一般设计成键值对 */ package cn.sx ...

  4. 《精通Python设计模式》学习行为型之责任链模式

    感觉是全新的学习了. 因为在以前的工作中,并没有有意识的去运用哪一种编程模式. 以后要注意的了. 这才是高手之路呀~ class Event: def __init__(self, name): se ...

  5. 【java设计模式】【行为模式Behavioral Pattern】迭代器模式Iterator Pattern

    package com.tn.pattern; public class Client { public static void main(String[] args) { Object[] objs ...

  6. 设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)

      设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型) 1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的 ...

  7. C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】

    一.引言   今天我们开始讲"行为型"设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看."迭代器模 ...

  8. C#设计模式之十五迭代器模式(Iterator Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看.“迭代器模式”我第一次看到这个名称,我的理解 ...

  9. 设计模式(十五):Iterator迭代器模式 -- 行为型模式

    1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...

随机推荐

  1. docker 安装ElasticSearch 6.x

    首先是拉去镜像(或者直接创建容器自然会拉去) docker pull elasticsearch:6.5.4 创建容器 docker run --name elasticsearch --net ho ...

  2. 小程序异步处理demo计时器setInterval()

    实现一个计时器/秒 其实就是要求对某字段每秒执行一次更新 这里用到了官方给的定时器 官方API 每秒刷新一次,所以用setInterval()方法 下面给出关键代码: 由于无关代码过多,这里尽可能贴出 ...

  3. 运行javac编译报错:仅当显式请求注释处理时才接受类名称“xxxxxx”

    发生原因:运行javac编译时没有加上扩展名.解决方法:加上.java扩展名重新编译即可,"xxxxxx.java".

  4. python学习之老男孩python全栈第九期_day021知识点总结——包、异常处理

    一. 包 # 把解决一类问题的模块放在同一个文件夹里 -- 包 # 创建目录代码# import os# os.makedirs('glance/api')# os.makedirs('glance/ ...

  5. tensorboard实现tensorflow可视化

    1.工程目录 2.data.input_data.py的导入 在tensorflow更新之后可以进行直接的input_data的导入 # from tensorflow.examples.tutori ...

  6. 洛谷P4781 【模板】拉格朗日插值(拉格朗日插值)

    题意 题目链接 Sol 记得NJU有个特别强的ACM队叫拉格朗,总感觉少了什么.. 不说了直接扔公式 \[f(x) = \sum_{i = 1}^n y_i \prod_{j \not = i} \f ...

  7. 理解webpack4.splitChunks

    一.前言 之前一直也没有研究过webpack4是基于怎样的规则去拆分模块的,现在正好有时间打算好好了解一下,看了官方文档也陆陆续续的看了看网上别人写的文章,感觉大部分都是将官方文档翻译了一遍,很多问题 ...

  8. laravel开发之-composer安装(windows)

    1 在https://getcomposer.org/download/中下载composer.exe 2 选择php.exe安装composer 3 cmd命令框中输入composer.查看是否安装 ...

  9. <!DOCTYPE> 标签是什么

    DOCTYPE 标签,是html文档的类型声明(document type declaration,所谓声明,也就是宣称我他妈是谁),用来告诉浏览器,使用什么样的文档类型定义(Document Typ ...

  10. centos使用ngnix代理https

    自己建web服务器,考虑到安全问题需要用到https. 在此使用nginx的反向代理功能实现https 腾讯云证书安装指引 ssl.conf 配置 // http请求重定向https server { ...