2017编程提高第8节课——面向对象设计(8)
LanyuanXiaoyao's Blog ヽ(✿゚▽゚)ノ

2017编程提高第8节课——面向对象设计(8)


行为型模式 (11个)

Iterator

public void print(Iterator<String> iter){
	while(iter.hasNext()){
		String s = iter.next();
		System.out.println(s);
	}
}

问题: iterator 可能是什么容器/集合创建的?

一个Iterator的粗略实现

public interface List<T> {
	boolean add(T o);
	T get(int index);
	T remove(int index);
	int size();
	Iterator<T> iterator();
}
public interface Iterator<T> {
	boolean hasNext();
	T next();
}
public class ArrayList<T> implements List<T> {
	private int size;
	private Object[] dataArray = new Object[0];
	……
	public T get(int index) {
		//实现略
	}
	public int size() {
		return this.size;
	}
	public Iterator<T> iterator() {
		return new ArrayListIterator();
	}
}
private class ArrayListIterator implements Iterator<T> {
	private int position;
	ArrayListIterator() {
	}
	public boolean hasNext() {
		return position < size();
	}
	public T next() {
		if (hasNext()) {
			return get(position++);
		}
		return null;
	}
}

UML类图

气象站的例子

气象站的代码

做出抽象

针对接口编程而不是实现编程

更多例子

再次抽象

观察者模式的优点

  • 实现了表示层和数据层的分离
  • 通过抽象的方式建立了低耦合
  • 支持广播通信
  • 实现了开闭原则

策略模式

薪水支付案例

鸭子游戏的例子

策略模式是算法吗?

  • 一个极为重要的模式
    • 看起来只不过是多态而已
  • 关键是要找到那个合适的抽象
    • Payment Classification/Method/Schedule
    • Quack /Fly Behavior

自己写个Web框架要考虑什么事情

  • 解析客户端发送的Http请求(框架)
    • 提取GET/POST的参数
    • 对参数进行安全处理(例如Encode)
    • 把参数封装成框架自定义的对象
  • 调用框架使用者编写的业务方法
    • 需要把参数传递进去
  • 根据业务方法的执行结果,找到对应的视图来渲染

模拟人生游戏

小练习:抽取模板方法

智能家居

配置文件

<congig>
	<slot id="0" on="DoorOnCommand" off="DoorOffCommand"/>
	<slot id="1" on="LightOnCommand" off="LightOffCommand"/>
	<slot id="2" on="TVOnCommand" off="TVOffCommand"/>
</congig>

实现方式1

实现方式2

使用Command 模式

菜单,按钮,快捷键  和 Command绑定

将调用者和接收者进行解耦!

Java Class 文件常量池

常量池代码

需求

  • 对常量池中的常量进行格式化打印
    • 如果是ClassInfo ,则不用缩进
    • 如果是MethodInfo , 方法名缩进4格, 每个参数显示一行
    • 如果是FiledInfo , 字段名缩进4格
    • 如果是StringInfo , 直接显示。

方案1

方案2:在每个类都重写toString()方法,格式化输出

方案3:使用Visitor

类图

解释器模式

当一个请求的发起方不知道应该谁来处理请求的时候……

火炉

把状态变成对象

类图

作业

实现一个Logger 的处理链

用command 模式实现下面的功能


评论