行为型模式关注系统中对象之间的相互交互,研究系统在运行时对象之间的相互通信和协作,进一步明确对象的职责
责任链模式:
将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象。
场景:例如请假审批,将请求交给班长,班长不行交给辅导员,辅导员不行交给学生办
我们可以使用 if if else 等处理请求,但是这种方式的弊端在于扩展性不好,并且代码之间的耦合度较高,不满足开闭原则。
开发中常见的场景:
-Java中,异常机制就是一种责任链模式。一个try可以对应多个catch,当第一个catch不匹配类型,则自动跳到第二个catch.
-Javascript语言中,事件的冒泡和捕获机制。Java语言中,事件的处理采用观察者模式。
-Servlet开发中,过滤器的链式处理
-Struts2中,拦截器的调用也是典型的责任链模式
//请假对象
public class LeaveRequest {
public String name;
public int day;
public LeaveRequest(String name, int day) {
this.name = name;
this.day = day;
}
}
abstract class RequestHandle{
RequestHandle nextRequestHandle;
abstract void handleRequest(LeaveRequest leaveRequest);
public void setNextRequestHandle(RequestHandle requestHandle){
this.nextRequestHandle = requestHandle;
};
}
class Monitor extends RequestHandle{
public void handleRequest(LeaveRequest leaveRequest){
if (leaveRequest.day<3){
System.out.println("请假成功");
return;
}else {
if (nextRequestHandle!=null){
nextRequestHandle.handleRequest(leaveRequest);
}else {
System.out.println("请假不成功");
}
}
}
}
class Counselor extends RequestHandle {
public void handleRequest(LeaveRequest leaveRequest){
if (leaveRequest.day<10){
System.out.println("请假成功");
return;
}else {
if (nextRequestHandle!=null){
nextRequestHandle.handleRequest(leaveRequest);
}else {
System.out.println("请假不成功");
}
}
}
}
class Demo{
public static void main(String[] args) {
Monitor monitor = new Monitor();
Counselor counselor = new Counselor();
monitor.setNextRequestHandle(counselor);
monitor.handleRequest(new LeaveRequest("A",5));
}
}
迭代器模式:
核心是游标,容器是数组或者集合。
如果使用链表也是可以的(就不需要游标了)
interface MyIterator{
public boolean hasNext();
public Object next();
}
public class ConcreteMyAggregate {
private List<Object> list = new ArrayList<>();
public void addObject(Object object) {
list.add(object);
}
public void removeObject(Object object) {
list.remove(object);
}
private ConcreteIterator getIterator() {
return new ConcreteIterator();
}
private class ConcreteIterator implements MyIterator{
private int cursor = 0;
public boolean hasNext() {
return cursor < list.size() ? true : false;
}
public Object next() {
Object o = list.get(cursor);
cursor++;
return o;
}
}
public static void main(String[] args) {
ConcreteMyAggregate concreteMyAggregate = new ConcreteMyAggregate();
concreteMyAggregate.addObject("1");
concreteMyAggregate.addObject("2");
concreteMyAggregate.addObject("3");
ConcreteIterator iterator = concreteMyAggregate.getIterator();
while (iterator.hasNext()){
Object next = iterator.next();
System.out.println(next);
}
}
}
中介者模式:
如果一个系统中对象之间的联系呈现为网状结构,对象之间存在大量多对多关系,将导致关系及其复杂,这些对象称为“同事对象",我们可以引入一个中介者对象,使各个同事对象只跟中介者对象打交道,将复杂的网络结构化解为如下的星形结构。
注意:如果对象调用关系简单,一定不要使用中介者模式。反而会变得复杂起来